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

PHP一致性hash分布式算法封装类定义与用法示例

发布:smiling 来源: PHP粉丝网  添加日期:2021-10-22 09:30:53 浏览: 评论:0 

这篇文章主要介绍了PHP一致性hash分布式算法封装类定义与用法,结合完整实例形式分析了一致性hash分布式算法的原理、实现及使用方法,需要的朋友可以参考下。

本文实例讲述了PHP一致性hash分布式算法封装类定义与用法,分享给大家供大家参考,具体如下:

一、无虚拟节点实现

  1. <?php 
  2. /** 
  3.  * 一致性hash分布式算法 
  4.  * @param $key 
  5.  * @return int 
  6.  * 实现步骤 
  7.  * 1.先将0~ 是32位最大带符号整数(0x7FFFFFFF) 想象成一个闭环 
  8.  * 2.将服务器列表通过hash算法分布在 圆环之中 
  9.  * 3.将key值也分布在圆环之中 
  10.  * 4.通过_isSorted判断服务器是否需要进行倒序排序 排序后遍历服务器 找到最近的服务器 返回 
  11.  * hash算法是不保证平衡的 为了尽量保证平衡性 我们应该加入虚拟节点数 将一个服务器节点虚拟化成为多个 较大程度上保证了平衡性 
  12.  */ 
  13. class FlexiHash{ 
  14.   private $_serverList = array(); 
  15.   private $_isSorted = false; 
  16.   private $_virtual_node_num = 20;//虚拟节点数 服务器越少 增加的虚拟节点数应该越多 
  17.   //通过hash算法返回一个整数值 
  18.   protected function myHash($key){ 
  19.     $md5 = substr(md5($key),0,8); 
  20.     $seed = 31; //种子值 
  21.     $hash=0; 
  22.     for($i=0;$i<8;$i++){ 
  23.       $hash = $hash*$seed+ord($md5{$i}); //ord 返回ascii值 
  24.       $i++; 
  25.     } 
  26.     return $hash&0x7FFFFFFF; //0x7FFFFFFF表示最大值 
  27.   } 
  28.   //添加服务器 
  29.   function addServer($server){ 
  30.     $hash =$this->myHash($server'#1'); 
  31.     if(!isset($this->_serverList[$hash])) { 
  32.       for ($i = 1; $i <= $this->_virtual_node_num; $i++) { 
  33.         $hash = $this->myHash($server . '#' . $i); 
  34.         $this->_serverList[$hash] = $server
  35.       } 
  36.     } 
  37.     $this->_isSorted = false; 
  38.     return true; 
  39.   } 
  40.   //删除服务器 
  41.   function removeServer($server){ 
  42.     for ($i = 1; $i <= $this->_virtual_node_num; $i++) { 
  43.       $hash = $this->myHash($server . '#' . $i); 
  44.       unset($this->_serverList[$hash]); 
  45.     } 
  46.     $this->_isSorted = false; 
  47.     return true; 
  48.   } 
  49.   //获取服务器 
  50.   function lookup($key){ 
  51.     $hash =$this->myHash($key); 
  52.     if(!$this->_isSorted){ 
  53.       krsort($this->_serverList,SORT_NUMERIC); 
  54.       $this->_isSorted = true; 
  55.     } 
  56.     foreach($this->_serverList as $pos=>$server){ 
  57.       if($hash >= $posreturn $server
  58.     } 
  59.     return end($this->_serverList); 
  60.   } 
  61.   public function getServerList(){ 
  62.     krsort($this->_serverList,SORT_NUMERIC); 
  63.     return $this->_serverList; 
  64.   } 
  65. //demo test 
  66. $hserver = new FlexiHash(); 
  67. //添加服务器 
  68. $hserver->addServer('192.168.1.1'); 
  69. $hserver->addServer('192.168.1.2'); 
  70. $hserver->addServer('192.168.1.3'); 
  71. $hserver->addServer('192.168.1.4'); 
  72. $hserver->addServer('192.168.1.5'); 
  73. $key1='Key1111'
  74. $key2='Key2222'
  75. $key2='Key3333'
  76. $key2='Key4444'
  77. $key2='Key5555'
  78. $key2='Key6666'
  79. echo "save key1 in server: ".$hserver->lookup($key1).PHP_EOL; 
  80. echo "save key2 in server: ".$hserver->lookup($key2).PHP_EOL; 
  81. echo "save key1 in server: ".$hserver->lookup($key3).PHP_EOL; 
  82. echo "save key2 in server: ".$hserver->lookup($key4).PHP_EOL; 
  83. echo "save key1 in server: ".$hserver->lookup($key5).PHP_EOL; 
  84. echo "save key2 in server: ".$hserver->lookup($key6).PHP_EOL; 
  85. echo "================================================".PHP_EOL; 
  86. //移除服务器 key值将自动转义到下一台服务器 
  87. $hserver->removeServer('192.168.1.4'); 
  88. echo "save key1 in server: ".$hserver->lookup($key1).PHP_EOL; 
  89. echo "save key2 in server: ".$hserver->lookup($key2).PHP_EOL; 
  90. echo "save key1 in server: ".$hserver->lookup($key3).PHP_EOL; 
  91. echo "save key2 in server: ".$hserver->lookup($key4).PHP_EOL; 
  92. echo "save key1 in server: ".$hserver->lookup($key5).PHP_EOL; 
  93. echo "save key2 in server: ".$hserver->lookup($key6).PHP_EOL; 
  94. echo "================================================".PHP_EOL; 
  95. //恢复故障服务器 key值将恢复原来服务器 
  96. $hserver->addServer('192.168.1.4'); 
  97. echo "save key1 in server: ".$hserver->lookup($key1).PHP_EOL; 
  98. echo "save key2 in server: ".$hserver->lookup($key2).PHP_EOL; 
  99. echo "save key1 in server: ".$hserver->lookup($key3).PHP_EOL; 
  100. echo "save key2 in server: ".$hserver->lookup($key4).PHP_EOL; 
  101. echo "save key1 in server: ".$hserver->lookup($key5).PHP_EOL; 
  102. echo "save key2 in server: ".$hserver->lookup($key6).PHP_EOL; 

二、运行结果:

  1. save key1 in server: 192.168.1.4 
  2. save key2 in server: 192.168.1.4 
  3. save key1 in server: 192.168.1.3 
  4. save key2 in server: 192.168.1.3 
  5. save key1 in server: 192.168.1.3 
  6. save key2 in server: 192.168.1.3 
  7. ================================================ 
  8. save key1 in server: 192.168.1.2 
  9. save key2 in server: 192.168.1.5 
  10. save key1 in server: 192.168.1.3 
  11. save key2 in server: 192.168.1.3 
  12. save key1 in server: 192.168.1.3 
  13. save key2 in server: 192.168.1.3 
  14. ================================================ 
  15. save key1 in server: 192.168.1.4 
  16. save key2 in server: 192.168.1.4 
  17. save key1 in server: 192.168.1.3 
  18. save key2 in server: 192.168.1.3 
  19. save key1 in server: 192.168.1.3 
  20. save key2 in server: 192.168.1.3

Tags: PHP一致性 hash分布式

分享到: