memcahe 取模 一致性哈希算法

<?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');




<?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');



<?Php
 #分布式memcache(取模计算)
 class GetModMemcache
 {
     private $total='';          #存储memcache服务器的总数
     private $servers=array();   #存储memcache服务器的具体信息
     /**
         * @desc 构造函数
         *
        * @param $serversArr array | memcache服务器具体信息
      */
     public function __construct($serversArr)
     {
         $this->total=count($serversArr);
         $this->servers=$serversArr;

     }

     /**
         * @desc 计算$key的存储位置(即哪个服务器)
         *
         * @param string | key字符串
         *
         * @return int  返回第几个服务器
         */
     protected function position($key)
     {
                 #使用crc32(),将字符串转化为32为的数字
     echo     sprintf('%u',crc32($key))%$this->total;      #取余29
    return sprintf('%u',crc32($key))%$this->total;      #取余29
      }

     /**
             * @desc 获取memcached对象
             *
             * @param $position int | key的位置信息
             *
             * @return object 返回实例化memcached对象
             */
     protected function getMemcached($position)
     {
         $host=$this->servers[$position]['host'];    #服务器池中某台服务器host
         $port=$this->servers[$position]['port'];    #服务器池中某台服务器port
         $m= new memcache();
         $m->addserver($host, $port);
         return $m;
     }

         /**
             * @desc 设置key-value值
             *
             * @param string | key字符串
             * @param mixed  | 值可以是任何有效的非资源型php类型
             *
             * @return 返回结果
             */
     public function setKey($key, $value)
     {
         $num=$this->position($key);
         $m=$this->getMemcached($num);   #获取memcached对象
         return $m->set($key, $value);
     }

     public function getKey($key)
     {
         $num=$this->position($key);
         $m=$this->getMemcached($num);
         return $m->get($key);
     }


 }


 $arr=array(
     array('host'=>'1.1.1.1', 'port'=>'11213'),
     array('host'=>'2.2.2.2', 'port'=>'11211'),
     array('host'=>'3.3.33', 'port'=>'11212'),
     );
 $mod=new GetModMemcache($arr);


 #存储数据
//$a=$mod->setKey('wang', 'ding',60);
$a=$mod->setKey('xxxx', 'ssssss11111111111111111111111',60);
// echo "<pre>";
// print_r($a);
//
// echo "</pre>";die;


 #获取数据
// $c=$mod->getKey('chen');
// echo "<pre>";
// print_r($c);
// echo "</pre>";die;

 ?>

$arr=array( array('host'=>'111.111.111.111', 'port'=>'11213'), array('host'=>'22.222.222.222', 'port'=>'11211'), array('host'=>'33.333.333.333', 'port'=>'11212'),);$mod=new ConsistentHashMemcache($arr);$mod->setKey('ooooooo','11111');
<?Php
 #分布式memcache(取模计算)
 class GetModMemcache
 {
     private $total='';          #存储memcache服务器的总数
     private $servers=array();   #存储memcache服务器的具体信息
     /**
         * @desc 构造函数
         *
        * @param $serversArr array | memcache服务器具体信息
      */
     public function __construct($serversArr)
     {
         $this->total=count($serversArr);
         $this->servers=$serversArr;

     }

     /**
         * @desc 计算$key的存储位置(即哪个服务器)
         *
         * @param string | key字符串
         *
         * @return int  返回第几个服务器
         */
     protected function position($key)
     {
                 #使用crc32(),将字符串转化为32为的数字
     echo     sprintf('%u',crc32($key))%$this->total;      #取余29
    return sprintf('%u',crc32($key))%$this->total;      #取余29
      }

     /**
             * @desc 获取memcached对象
             *
             * @param $position int | key的位置信息
             *
             * @return object 返回实例化memcached对象
             */
     protected function getMemcached($position)
     {
         $host=$this->servers[$position]['host'];    #服务器池中某台服务器host
         $port=$this->servers[$position]['port'];    #服务器池中某台服务器port
         $m= new memcache();
         $m->addserver($host, $port);
         return $m;
     }

         /**
             * @desc 设置key-value值
             *
             * @param string | key字符串
             * @param mixed  | 值可以是任何有效的非资源型php类型
             *
             * @return 返回结果
             */
     public function setKey($key, $value)
     {
         $num=$this->position($key);
         $m=$this->getMemcached($num);   #获取memcached对象
         return $m->set($key, $value);
     }

     public function getKey($key)
     {
         $num=$this->position($key);
         $m=$this->getMemcached($num);
         return $m->get($key);
     }


 }


 $arr=array(
     array('host'=>'1.1.1.1', 'port'=>'11213'),
     array('host'=>'2.2.2.2', 'port'=>'11211'),
     array('host'=>'5.5.5.5', 'port'=>'11212'),
     );
 $mod=new GetModMemcache($arr);


 #存储数据
//$a=$mod->setKey('wang', 'ding',60);
$a=$mod->setKey('xxxx', 'ssssss11111111111111111111111',60);
// echo "<pre>";
// print_r($a);
//
// echo "</pre>";die;


 #获取数据
// $c=$mod->getKey('chen');
// echo "<pre>";
// print_r($c);
// echo "</pre>";die;

 ?>



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值