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执行速度全攻略(上)
Oct 09 PHP
谈谈新手如何学习PHP
Dec 23 PHP
深入PHP异步执行的详解
Jun 03 PHP
PHP用身份证号获取星座和生肖的方法
Nov 07 PHP
php循环创建目录示例分享(php创建多级目录)
Mar 04 PHP
php中的观察者模式简单实例
Jan 20 PHP
Laravel 5 框架入门(一)
Apr 09 PHP
在Mac OS上搭建PHP的Yii框架及相关测试环境
Feb 14 PHP
PHPExcel笔记, mpdf导出
May 03 PHP
php array_merge_recursive 数组合并
Oct 26 PHP
php session_decode函数用法讲解
May 26 PHP
php实现JWT(json web token)鉴权实例详解
Nov 05 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
关于文本留言本的分页代码
2006/10/09 PHP
php中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)
2010/12/19 PHP
PHP中比较两个字符串找出第一个不同字符位置例子
2014/04/08 PHP
PHP翻页跳转功能实现方法
2020/11/30 PHP
用JS操作FRAME中的IFRAME及其内容的实现代码
2008/07/26 Javascript
JavaScript模板入门介绍
2012/09/26 Javascript
javascript验证只能输入数字和一个小数点示例
2013/10/21 Javascript
js操纵dom生成下拉列表框的方法
2014/02/24 Javascript
Bootstrap轮播加上css3动画,炫酷到底!
2015/12/22 Javascript
Jquery基础之事件操作详解
2016/06/14 Javascript
Bootstrap框架的学习教程详解(二)
2016/10/18 Javascript
利用Angular+Angular-Ui实现分页(代码加简单)
2017/03/10 Javascript
JavaScript定时器setTimeout()和setInterval()详解
2017/08/18 Javascript
Node中使用ES6语法的基础教程
2018/01/05 Javascript
使用Vue构建可重用的分页组件
2018/03/26 Javascript
js jquery 获取某一元素到浏览器顶端的距离实现方法
2018/09/05 jQuery
vue中组件的过渡动画及实现代码
2018/11/21 Javascript
vue+element实现表单校验功能
2019/05/20 Javascript
angular使用md5,CryptoJS des加密的方法
2019/06/03 Javascript
vue监听用户输入和点击功能
2019/09/27 Javascript
node+multer实现图片上传的示例代码
2020/02/18 Javascript
详解字典树Trie结构及其Python代码实现
2016/06/03 Python
Python 一句话生成字母表的方法
2019/01/02 Python
python实现雪花飘落效果实例讲解
2019/06/18 Python
使用python计算三角形的斜边例子
2020/04/15 Python
HTML5地理定位与第三方工具百度地图的应用
2016/11/17 HTML / CSS
介绍一下HTTP、HTTPS和SSL
2012/12/16 面试题
javascript实现用户必须勾选协议实例讲解
2021/03/24 Javascript
幼儿园中班评语大全
2014/04/17 职场文书
2014年三万活动总结
2014/04/26 职场文书
教师优秀党员事迹材料
2014/08/14 职场文书
职业生涯规划书怎么写?
2014/09/14 职场文书
工伤事故赔偿协议书(标准)
2014/09/29 职场文书
行政主管岗位职责范本
2015/04/09 职场文书
八一建军节主持词
2015/07/01 职场文书
SQL Server数据库备份和恢复数据库的全过程
2022/06/14 SQL Server