memcahe 取模 一致性哈希算法

xiaoxiao2021-02-28  101

<?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; ?>
转载请注明原文地址: https://www.6miu.com/read-21188.html

最新回复(0)