分布式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点的思想是基于一体哈希算法,相比较于传统的一体哈希算法,在服务器挂掉其中一台或者几台时,不会造成仅存的服务器因压力骤大而停机,也比传统的取余计算方式合理

在某台服务器停机时,会将压力合理的分摊到其他的服务器

posted @ 2017-09-07 16:52  spritphp  阅读(330)  评论(0编辑  收藏  举报