zoukankan      html  css  js  c++  java
  • 10 Memcached 一致性哈希分布式算法原理与实现[PHP实现]

     1 <?php  
     2 
     3 header("Content-type:text/html;charset=utf-8");
     4 
     5 interface  hash{
     6 
     7     public function _hash($str);
     8 }
     9 interface distribution{
    10 
    11     public function lookup($key);
    12 }
    13 /****
    14 一致性哈希分布式算法原理与实现[PHP实现]
    15 **/
    16 class Consistent  implements hash,distribution{
    17     #存放实际节点
    18     protected $_nodes=array();
    19     #定义虚拟节点的个数
    20     protected $mul=64;
    21     #定义一个位置数组 记录节点所在位置
    22     protected $_position=array();
    23     #算出节点
    24     public function _hash($str){
    25         return sprintf('%u',crc32($str));//把字符串转成32位符号的整数
    26     }
    27     #核心功能
    28     public function lookup($key){
    29         #算出当前节点
    30         $point=$this->_hash($key);
    31         $node=current($this->_position);//先取圆环上最小的一个节点
    32         #循环所以节点
    33         foreach($this->_nodes as $k=>$v){
    34             #找到当前节点所在在的节点数,如果没找到说明大于所以节点 既在最小的节点上
    35             if($point<=$k){
    36                $node=$v;
    37                break;
    38             }
    39         }
    40         return $node;
    41     }
    42     #增加一个节点
    43     public function addNode($node){
    44         #存储到数组中去  arrar([key=>val])
    45         //$this->_nodes[$this->_hash($node)]=$node;
    46         for ($i=0; $i < $this->mul; $i++) { 
    47             $this->_position[$this->_hash($node.'-'.$i)]=$node;
    48         }
    49         $this->_sortNode();
    50 
    51     }
    52     #删除一个节点
    53     public function delNode($node){
    54         foreach ($this->_position as $k => $v) {
    55             if($v==$node){
    56                 unset($this->_position[$k]);
    57             }
    58         }
    59     }
    60     #排序
    61     protected function _sortNode(){
    62         #SORT_REGULAR 根据key的大小进行排序
    63         ksort($this->_position,SORT_REGULAR);
    64     }
    65     #打印出所有的虚拟节点
    66     public function getNodes(){
    67         var_dump($this->_position);
    68     }
    69 }
    70 $con=new Consistent();
    71 $con->addNode('a');
    72 $con->addNode('b');
    73 $con->addNode('c');
    74 
    75 
    76 echo '当前所以服务器如下:<br/>';
    77  $con->getNodes();
    78 echo '<br/>当前的建计算的hsas落点是'.$con->_hash('name').'<br/>';
    79 echo  'name'.'在'.$con->lookup('name').'节点上';
  • 相关阅读:
    scala初体验
    获取GeometricNetwork中所有的Junction
    开始一点一滴积累
    升级ArcEngine How to migrate ArcGIS 9.3 Desktop and Engine standalone applications to ArcGIS 10
    OpenGIS简要参考
    IIS5.1部署WCF4 REST Service注意事项
    [转]LINQ SubmitChanges方法 (并发处理)
    BAT常用命令
    DataContext.GetChangeSet方法 (得到改变内容的行)
    SQL 数据库操作
  • 原文地址:https://www.cnblogs.com/hgj123/p/4221727.html
Copyright © 2011-2022 走看看