PHP实现的服务器一致性hash分布算法示例


Posted in PHP onAugust 09, 2018

本文实例讲述了PHP实现的服务器一致性hash分布算法。分享给大家供大家参考,具体如下:

<?php
/**
 * 对服务器进行一致性hash分布算法
 */
class HashRing
{
  private $servers = array();
  private $nodeList = array();
  private $nodeHashList = array();
  private $nodeTotalNum = 0;
  private $virtualNodeNum = 32;
  private $keyHash = '';
  public function __construct($servers)
  {
    $this->servers = $servers;
    foreach ($servers as $server) {
      for ($i = 0; $i < $this->virtualNodeNum; $i++) {
        $this->nodeList[sprintf("%u", crc32($server.'-'.$i))] = array($server, $i);
      }
    }
    ksort($this->nodeList);
    $this->nodeHashList = array_keys($this->nodeList);
  }
  private function getNodeIndex($key)
  {
    $this->keyHash = sprintf("%u", crc32($key));
    if ($this->keyHash > end($this->nodeHashList)) {
      $this->keyHash = $this->keyHash % end($this->nodeHashList);
    }
    if ($this->keyHash <= reset($this->nodeHashList)) {
      return 0;
    }
    $this->nodeTotalNum = count($this->nodeHashList);
    return $this->binaryChopIndex(0, $this->nodeTotalNum);
  }
  private function binaryChopIndex($l=0, $r=0)
  {
    if ($l < $r) {
      $avg = intval(($l+$r) / 2);
      if ($this->nodeHashList[$avg] == $this->keyHash) {
        return $avg;
      } elseif ($this->keyHash < $this->nodeHashList[$avg] && ($avg > 0)) {
        return $this->binaryChopIndex($l, $avg-1);
      } else {
        return $this->binaryChopIndex($avg+1, $r);
      }
    } else {
      return $l;
    }
  }
  public function getServersByKey($key, $num=1)
  {
    $index = $this->getNodeIndex($key);
    $server = $this->nodeList[$this->nodeHashList[$index]];
    if ($num == 1) {
      return $server[0];
    }
    if ($num >= count($this->servers)) {
      $num = count($this->servers);
    }
    $result = array($server[0]);
    for ($i=$index+1; true; $i++) {
      if ($i >= $this->nodeTotalNum) {
        $i = 0;
      }
      $nextServer = $this->nodeList[$this->nodeHashList[$i]];
      if (!in_array($nextServer[0], $result)) {
        $result[] = $nextServer[0];
      }
      if (count($result) == $num) {
        break;
      }
    }
    return $result;
  }
}
//示例
$servers = array(
  '127.0.0.1:11211',
  '127.0.0.1:11212',
  '127.0.0.1:11213',
  '127.0.0.1:11214',
  '127.0.0.1:11215'
);
$obj = new HashRing($servers);
$servers = $obj->getServersByKey('testkey', 2);
print_r($servers);
echo "\n";

运行结果:

Array
(
    [0] => 127.0.0.1:11214
    [1] => 127.0.0.1:11211
)

PHP 相关文章推荐
如何限制访问者的ip(PHPBB的代码)
Oct 09 PHP
在同一窗体中使用PHP来处理多个提交任务
May 08 PHP
PHP时间格式控制符对照表分享
Jul 23 PHP
ThinkPHP CURD方法之field方法详解
Jun 18 PHP
php实现excel中rank函数功能的方法
Jan 20 PHP
php计算到指定日期还有多少天的方法
Apr 14 PHP
PHP中多线程的两个实现方法
Oct 14 PHP
PHP针对伪静态的注入总结【附asp与Python相关代码】
Aug 01 PHP
PHP memcache在微信公众平台的应用方法示例
Sep 13 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
Sep 22 PHP
laravel 操作数据库常用函数的返回值方法
Oct 11 PHP
PHP反射基础知识回顾
Sep 10 PHP
PHP检查端口是否可以被绑定的方法示例
Aug 09 #PHP
php对象工厂类完整示例
Aug 09 #PHP
php闭包中使用use声明变量的作用域实例分析
Aug 09 #PHP
php生成二维码不保存服务器还有下载功能的实现代码
Aug 09 #PHP
PHP命令Command模式用法实例分析
Aug 08 #PHP
PHP耦合设计模式实例分析
Aug 08 #PHP
thinkPHP框架整合tcpdf插件操作示例
Aug 07 #PHP
You might like
php+webSoket实现聊天室示例代码(附源码)
2017/02/17 PHP
thinkPHP框架实现的短信接口验证码功能示例
2018/06/20 PHP
PHP程序守护进程化实现方法详解
2020/07/16 PHP
用window.location.href实现刷新另个框架页面
2007/03/07 Javascript
javascript优先加载笔记代码
2008/09/30 Javascript
用函数模板,写一个简单高效的 JSON 查询器的方法介绍
2013/04/17 Javascript
jquery实现手风琴效果实例代码
2013/11/15 Javascript
jQuery向上遍历DOM树之parents(),parent(),closest()之间的区别
2013/12/02 Javascript
js 中将多个逗号替换为一个逗号的代码
2014/06/07 Javascript
JS实现鼠标滑过折叠与展开菜单效果代码
2015/09/06 Javascript
JavaScript+html5 canvas实现图片破碎重组动画特效
2016/02/22 Javascript
使用jQuery Rotare实现微信大转盘抽奖功能
2016/06/20 Javascript
JavaScript实现时间倒计时跳转(推荐)
2016/06/28 Javascript
JavaScript实现拖拽元素对齐到网格(每次移动固定距离)
2016/11/30 Javascript
JavaScript仿聊天室聊天记录
2016/12/27 Javascript
整理关于Bootstrap表单的慕课笔记
2017/03/29 Javascript
AngularJS中控制器函数的定义与使用方法示例
2017/10/10 Javascript
利用vue + element实现表格分页和前端搜索的方法
2017/12/25 Javascript
Vue.js上传图片到阿里云OSS存储的方法示例
2018/12/13 Javascript
Angular7中创建组件/自定义指令/管道的方法实例详解
2019/04/02 Javascript
element中table高度自适应的实现
2020/10/21 Javascript
python字典操作实例详解
2017/11/16 Python
TensorFlow 实战之实现卷积神经网络的实例讲解
2018/02/26 Python
Ubuntu下使用python读取doc和docx文档的内容方法
2018/05/08 Python
解决vscode python print 输出窗口中文乱码的问题
2018/12/03 Python
详解Python利用random生成一个列表内的随机数
2019/08/21 Python
巴基斯坦电子产品购物网站:Home Shopping
2017/09/14 全球购物
Supersmart英国:欧洲市场首批食品补充剂供应商之一
2018/05/05 全球购物
Dr.Jart+美国官网:韩国药妆品牌
2019/01/18 全球购物
新学期班主任寄语
2014/01/18 职场文书
幼儿园新年寄语
2014/04/03 职场文书
交通文明倡议书
2014/05/16 职场文书
民事纠纷协议书
2016/03/23 职场文书
2019年国庆祝福语(70句)
2019/09/19 职场文书
用python基于appium模块开发一个自动收取能量的小助手
2021/09/25 Python
Ubuntu Server 安装Tomcat并配置systemctl
2022/04/28 Servers