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 相关文章推荐
发布一个用PHP fsockopen写的HTTP下载的类
Feb 22 PHP
php报表之jpgraph柱状图实例代码
Aug 22 PHP
对PHP语言认识上需要避免的10大误区
Jun 12 PHP
PHP动态页生成静态页的3种常用方法
Nov 13 PHP
PHP中error_log()函数的使用方法
Jan 20 PHP
PHP也能干大事 随机函数
Apr 14 PHP
php实现文本数据导入SQL SERVER
May 17 PHP
PHP实现图片自动清理的方法
Jul 08 PHP
PHP生成随机字符串(3种方法)
Sep 25 PHP
thinkphp制作404跳转页的简单实现方法
Sep 22 PHP
thinkPHP5框架闭包函数与子查询传参用法示例
Aug 02 PHP
Thinkphp页面跳转设置跳转等待时间的操作
Oct 16 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学习之PHP表达式
2006/10/09 PHP
支持oicq头像的留言簿(二)
2006/10/09 PHP
基于PHP的简单采集数据入库程序【续篇】
2014/07/30 PHP
PHP封装的字符串加密解密函数
2015/12/18 PHP
php mailer类调用远程SMTP服务器发送邮件实现方法
2016/03/04 PHP
Zend Framework动作助手Json用法实例分析
2016/03/05 PHP
Zend Framework教程之Application用法实例详解
2016/03/14 PHP
PHP的Yii框架中使用数据库的配置和SQL操作实例教程
2016/03/17 PHP
PHP实现的XXTEA加密解密算法示例
2018/08/28 PHP
基于jQuery创建鼠标悬停效果的方法
2015/03/07 Javascript
JS根据生日算年龄的方法
2015/05/05 Javascript
IE中document.createElement的iframe无法设置属性name的解决方法
2015/09/14 Javascript
多种js图片预加载实现方式分享
2016/02/19 Javascript
jQuery层级选择器实例代码
2017/02/06 Javascript
MUI实现上拉加载和下拉刷新效果
2017/06/30 Javascript
Vue实战之vue登录验证的实现代码
2017/10/31 Javascript
vue中路由验证和相应拦截的使用详解
2017/12/13 Javascript
jquery实现自定义树形表格的方法【自定义树形结构table】
2019/07/12 jQuery
vue 开发企业微信整合案例分析
2019/12/02 Javascript
利用Python实现原创工具的Logo与Help
2018/12/03 Python
对python捕获ctrl+c手工中断程序的两种方法详解
2018/12/26 Python
Python 中包/模块的 `import` 操作代码
2019/04/22 Python
django实现支付宝支付实例讲解
2019/10/17 Python
使用Python制作缩放自如的圣诞老人(圣诞树)
2019/12/25 Python
Python reshape的用法及多个二维数组合并为三维数组的实例
2020/02/07 Python
python 实现图像快速替换某种颜色
2020/06/04 Python
XD健身器材:Kevlar球、Crossfit健身球
2019/03/26 全球购物
编写strcpy函数
2014/06/24 面试题
中学家长会邀请函
2014/02/03 职场文书
致垒球运动员加油稿
2014/02/16 职场文书
反腐倡廉警示教育活动总结
2014/05/05 职场文书
汽修专业自荐信
2014/07/07 职场文书
让生命充满爱观后感
2015/06/08 职场文书
贷款担保书范本
2015/09/22 职场文书
CSS filter 有什么神奇用途
2021/05/25 HTML / CSS
修改Nginx配置返回指定content-type的方法
2022/09/23 Servers