分布式memcached-虚拟节点
1.通过memcached服务器下的不同端口来达到模拟多台服务器的效果
2.假设现在有三台memcached服务器,本地分别使用11211,11212,11213三个端口来模拟
①打开端口
②连接端口
③以同样的方式别打开三台,不要关闭cmd窗口,记得ctrl+】回显
3.上代码
1 <?php 2 //一致性哈希算法 3 class Memcached1{ 4 protected $server=['11211','11212','11213']; 5 protected $node=[]; 6 protected $memcache; 7 //memcached服务器连接 8 public function __construct() 9 { 10 11 } 12 13 protected function MemcachedConnect($port){ 14 $this->memcache=new Memcache(); 15 $a=$this->memcache->connect('localhost',$port); 16 } 17 //产生虚拟节点 18 public function GetServer(){ 19 foreach ($this->server as $k=>$v){ 20 for ($i=1;$i<=100;$i++){ 21 $m=sprintf("%u", crc32($v.'_'.$i)); 22 $this->node[$m]=$v; 23 } 24 } 25 ksort($this->node); 26 return $this->node; 27 } 28 //获取缓存存放节点 29 protected function GetPort($key){ 30 $key=sprintf("%u",crc32($key)); 31 $nodelist=array_keys($this->node);//返回一个包含数组所有键名的数组(从小到大) 32 foreach ($this->node as $k=>$v){ 33 if ($key>max($nodelist)){ 34 $port=$this->node[$nodelist[0]]; 35 break; 36 } 37 if ($key<=$k){ 38 $port=$v; 39 break; 40 } 41 } 42 return $port; 43 } 44 //生成缓存 45 public function SetMemcached($key,$value){ 46 //生成虚拟节点 47 $this->GetServer(); 48 //获得数据存放端口 49 $p=$this->GetPort($key); 50 //链接memcached服务器 51 $this->MemcachedConnect($p); 52 $this->memcache->set($key,$value); 53 echo "ok"; 54 } 55 public function get($key){ 56 //生成虚拟节点 57 $this->GetServer(); 58 //获得数据存放端口 59 $p=$this->GetPort($key); 60 //链接memcached服务器 61 $this->MemcachedConnect($p); 62 return $this->memcache->get($key); 63 64 } 65 } 66 $m=new Memcached1; 67 //$list=$m->GetServer(); 68 echo "<pre>"; 69 //print_r($m->node); 70 $m->SetMemcached('aaa','aaa'); 71 //echo $m->get('aaa');
4.总结
虚拟节t点的思想是基于一体哈希算法,相比较于传统的一体哈希算法,在服务器挂掉其中一台或者几台时,不会造成仅存的服务器因压力骤大而停机,也比传统的取余计算方式合理
在某台服务器停机时,会将压力合理的分摊到其他的服务器