当前位置:首页 > PHP教程 > php高级应用 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2021-10-23 14:25:08 浏览: 评论:0 

这篇文章主要介绍了PHP实现的服务器一致性hash分布算法,结合实例形式分析了php一致性hash分布算法类的具体定义与相关使用技巧,需要的朋友可以参考下。

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

  1. <?php 
  2. /** 
  3.  * 对服务器进行一致性hash分布算法 
  4.  */ 
  5. class HashRing 
  6.   private $servers = array(); 
  7.   private $nodeList = array(); 
  8.   private $nodeHashList = array(); 
  9.   private $nodeTotalNum = 0; 
  10.   private $virtualNodeNum = 32; 
  11.   private $keyHash = ''
  12.   public function __construct($servers
  13.   { 
  14.     $this->servers = $servers
  15.     foreach ($servers as $server) { 
  16.       for ($i = 0; $i < $this->virtualNodeNum; $i++) { 
  17.         $this->nodeList[sprintf("%u", crc32($server.'-'.$i))] = array($server$i); 
  18.       } 
  19.     } 
  20.     ksort($this->nodeList); 
  21.     $this->nodeHashList = array_keys($this->nodeList); 
  22.   } 
  23.   private function getNodeIndex($key
  24.   { 
  25.     $this->keyHash = sprintf("%u", crc32($key)); 
  26.     if ($this->keyHash > end($this->nodeHashList)) { 
  27.       $this->keyHash = $this->keyHash % end($this->nodeHashList); 
  28.     } 
  29.     if ($this->keyHash <= reset($this->nodeHashList)) { 
  30.       return 0; 
  31.     } 
  32.     $this->nodeTotalNum = count($this->nodeHashList); 
  33.     return $this->binaryChopIndex(0, $this->nodeTotalNum); 
  34.   } 
  35.   private function binaryChopIndex($l=0, $r=0) 
  36.   { 
  37.     if ($l < $r) { 
  38.       $avg = intval(($l+$r) / 2); 
  39.       if ($this->nodeHashList[$avg] == $this->keyHash) { 
  40.         return $avg
  41.       } elseif ($this->keyHash < $this->nodeHashList[$avg] && ($avg > 0)) { 
  42.         return $this->binaryChopIndex($l$avg-1); 
  43.       } else { 
  44.         return $this->binaryChopIndex($avg+1, $r); 
  45.       } 
  46.     } else { 
  47.       return $l
  48.     } 
  49.   } 
  50.   public function getServersByKey($key$num=1) 
  51.   { 
  52.     $index = $this->getNodeIndex($key); 
  53.     $server = $this->nodeList[$this->nodeHashList[$index]]; 
  54.     if ($num == 1) { 
  55.       return $server[0]; 
  56.     } 
  57.     if ($num >= count($this->servers)) { 
  58.       $num = count($this->servers); 
  59.     } 
  60.     $result = array($server[0]); 
  61.     for ($i=$index+1; true; $i++) { 
  62.       if ($i >= $this->nodeTotalNum) { 
  63.         $i = 0; 
  64.       } 
  65.       $nextServer = $this->nodeList[$this->nodeHashList[$i]]; 
  66.       if (!in_array($nextServer[0], $result)) { 
  67.         $result[] = $nextServer[0]; 
  68.       } 
  69.       if (count($result) == $num) { 
  70.         break
  71.       } 
  72.     } 
  73.     return $result
  74.   } 
  75. //示例 
  76. $servers = array
  77.   '127.0.0.1:11211'
  78.   '127.0.0.1:11212'
  79.   '127.0.0.1:11213'
  80.   '127.0.0.1:11214'
  81.   '127.0.0.1:11215' 
  82. ); 
  83. $obj = new HashRing($servers); 
  84. $servers = $obj->getServersByKey('testkey', 2); 
  85. print_r($servers); 
  86. echo "\n"

运行结果:

  1. Array 
  2.     [0] => 127.0.0.1:11214 
  3.     [1] => 127.0.0.1:11211 
  4. )

Tags: PHP服务器一致性 hash分布

分享到: