分布式memcache 一致性哈希算法(采用环状数据结构)

1 篇文章 0 订阅
0 篇文章 0 订阅

 

<?php
 #分布式memcache 一致性哈希算法(采用环状数据结构)
 class ConsistentHashMemcache
 {
     private $virtualNode='';      #用于存储虚拟节点个数
     private $realNode=array();    #用于存储真实节点
     private $servers=array();     #用于存储memcache服务器信息
     #private $totalNode=array();   #节点总数
     /**
         * @desc 构造函数
         *
         * @param $servers array    | memcache服务器的信息
         * @param $virtualNode int | 虚拟节点个数,默认64个
         */
     public function __construct($servers, $virtualNode=64)
     {
         $this->servers=$servers;
         $this->realNode=array_keys($servers);
         $this->virtualNode=$virtualNode;
     }

     /**
    * @return int 返回32位的数字
    */
     private function hash($str)
     {
         return sprintf('%u',crc32($str));   #将字符串转换为32位的数字 28
     }

     /**
     * @desc 处理节点
     *
     * @param $realNode     array | 真实节点
     * @param $virturalNode int   | 虚拟节点个数
     *
     * @return array 返回所有节点信息
     */
     private function dealNode($realNode, $virtualNode)
     {
         $totalNode=array();
         foreach ($realNode as $v)
          {
               for($i=0; $i<$virtualNode; $i++)
               {
                   $hashNode=$this->hash($v.'-'.$i);
                   $totalNode[$hashNode]=$v;
               }
         }
         ksort($totalNode);     #按照索引进行排序,升序
         return $totalNode;
     }

     /**
     * @desc 获取key的真实存储节点
     *
     * @param $key string | key字符串
     *
     * @return string 返回真实节点
     */
     private function getNode($key)
     {

          $totalNode=$this->dealNode($this->realNode, $this->virtualNode);
          #获取所有虚拟节点
         /* #查看虚拟节点总数
         echo "<pre>";
         print_r($totalNode);
         echo "</pre>";die;
         */
         $hashNode=$this->hash($key);            #key的哈希节点
         foreach ($totalNode as $k => $v)        #循环总结点环查找
          {
              if($k >= $hashNode)                 #查找第一个大于key哈希节点的值
              {
                  echo $v;
                    return $v;                      #返回真实节点 74
              }
          }
             return reset($totalNode); #假若总节点环的值都比key哈希节点小,则返回第一个总哈希环的value值
      }

     /**
     * @desc 返回memcached对象
     *
     * @param $key string | key值
     *
     * @return object
     */
     private function getMemcached($key)
     {
         $node=$this->getNode($key);             #获取真实节点
         echo  $key.'真实节点:'.$node.'<br/>'; #测试使用,查看key的真实节点
         $host=$this->servers[$node]['host'];    #服务器池中某台服务器host
         $port=$this->servers[$node]['port'];    #服务器池中某台服务器port
         $m= new memcache();                    #实例化
         $m->addserver($host, $port);            #添加memcache服务器 94
         return $m;                              #返回memcached对象 95
      }

     /**
     * @desc 设置key-value值
     */
     public function setKey($key, $value)
     {
            $m=$this->getMemcached($key);
            return $m->set($key, $value);
     }

     /**
     * @desc 获取key中的value
      */
     public function getKey($key)
     {
         $m=$this->getMemcached($key);
         return $m->get($key);
     }
 }

$arr=array(
    array('host'=>'192.168.1.23', 'port'=>'11213'),
    array('host'=>'127.0.0.1', 'port'=>'11211'),
    array('host'=>'192.168.1.195', 'port'=>'11212'),
);
$mod=new ConsistentHashMemcache($arr);
$mod->setKey('梅','11111');

参考文献:

https://blog.csdn.net/zhq_bo/article/details/71199126

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值