设为首页 加入收藏

TOP

memcache 分布式缓存(一)
2017-10-10 10:21:04 】 浏览:3609
Tags:memcache 分布式

转载地址:http://www.cnblogs.com/phpstudy2015-6/p/6713164.html

作者:那一叶随风

1、memcached分布式简介

  memcached虽然称为“分布式”缓存服务器,但服务器端并没有“分布式”功能。Memcache集群主机不能够相互通信传输数据,它的“分布式”是基于客户端的程序逻辑算法进一步实现的。

请看下面简图:

技术分享

根据上图我们简述分析分布式memcached的set与get的过程

set过程:

1、首先通过应用程序set(‘key’,’value’)

2、进入程序,使用key通过逻辑算法得出这个key需要存储的节点位置

3、根据节点位置连接相应的memcached服务器,并发送set命令

get过程:

1、首先通过应用程序get(‘key’)

2、接着使用该key通过逻辑算法获取该key的存储节点

3、根据节点连接相应的memcached服务器,并发送get命令

  实现memcached有很多种方式,其中最常用的就是一致哈希思想的分布式(就简称为一致哈希分布式啦)。好的东西当然需要次劣品来衬托它的优点啦,因此在这里除了讲解一致哈希分布式,还会讲到取模分布式。从而进一步分析他们的优缺点。

  这里的例子都会采用PHP代码实现,当然啦,最重要的是思想与方法嘛!毕竟这两样东西在任何语言中都是相通的。

 

2、取模算法方式

  何为取模算法方式分布式?就是将key转换为32位的数字,并与memcached服务器的总数进行相除取得余数。而这个余数就是memcached服务器的节点node。有了这个node我们就可以确定memcached服务器,就可以发送命令给memcached执行了。

图示解析:

技术分享

整个过程上图所示。

1)、PHP代码实现

GetModMemcache.class.php

 1 <?php
 2 #分布式memcache(取模计算)
 3 class GetModMemcache
 4 {
 5     private $total=‘‘;          #存储memcache服务器的总数
 6     private $servers=array();   #存储memcache服务器的具体信息
 7     /**
 8     * @desc 构造函数
 9     *
10     * @param $serversArr array | memcache服务器具体信息
11     */
12     public function __construct($serversArr)
13     {
14         $this->total=count($serversArr);
15         $this->servers=$serversArr;
16     }
17 
18     /**
19     * @desc 计算$key的存储位置(即哪个服务器)
20     * 
21     * @param string | key字符串
22     *
23     * @return int  返回第几个服务器
24     */
25     protected function position($key)
26     {
27         #使用crc32(),将字符串转化为32为的数字
28         return sprintf(‘%u‘,crc32($key))%$this->total;      #取余
29     }
30 
31     /**
32     * @desc 获取memcached对象
33     *
34     * @param $position int | key的位置信息
35     *
36     * @return object 返回实例化memcached对象
37     */
38     protected function getMemcached($position)
39     {
40         $host=$this->servers[$position][‘host‘];    #服务器池中某台服务器host
41         $port=$this->servers[$position][‘port‘];    #服务器池中某台服务器port
42         $m= new memcached();
43         $m->addserver($host, $port);
44         return $m; 
45     }
46 
47     /**
48     * @desc 设置key-value值
49     *
50     * @param string | key字符串
51     * @param mixed  | 值可以是任何有效的非资源型php类型
52     *
53     * @return 返回结果
54     */
55     public function setKey($key, $value)
56     {
57         $num=$this->position($key);
58         echo $num;      #调试用
59         $m=$this->getMemcached($num);   #获取memcached对象
60         return $m->set($key, $value);
61     }
62 
63     public function getKey($key)
64     {
65         $num=$this->position($key);
66         $m=$this->getMemcached($num);
67         return $m->get($key);
68     }
69 
70 
71 }
72 
73 
74 $arr=array(
75     array(‘host‘=>‘192.168.95.11‘, ‘port‘=>‘11210‘),
76     array(‘host‘=>‘192.168.95.11‘, ‘port‘=>‘11211‘),
77     array(‘host‘=>‘192.168.95.11‘, ‘port‘=>‘11212‘),
78     );
79 $mod=new GetModMemcache($arr);
80 
81 /*
82 #存储数据
83 $a=$mod->setKey(‘key3‘, ‘key33333‘);
84 echo "<pre>";
85 print_r($a);
86 echo "</pre>";die;
87 */
88 /*
89 #获取数据
90 $b=$mod->getKey(‘key1‘);
91 echo "<pre>";
92 print_r($b);
93 echo "</pre>";die;
94 */
95 ?>

 

2)、进行相应测试

  1、连续插入三个数据

  #set(‘key1’,’value11111’);  #node=1

  #set(‘key2’,’value22222’);  #node=1

  #set(‘key3’,’value33333’;)  #node=0

  2、分别telnet连接192.168.95.11:(11210、11211、11212)

  11210含有key3数据

  11211含有key1、key2数据

  11212不含数据

  3、使用程序get数据

  结果都能够将数据取出来

3)、优缺点

  优点:

  1、简单实用易理解

  2、数据分布均匀

  缺点:

  1、宕了一台memcached服务器时不能自动调整群组去处理数据,使一部分数据不能使用缓存,一直持续从数据库中获取数据。

  2、当需要扩容的时候,增加多台memcached服务器,那么原来已

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇WAMP环境配置-Apache服务器的安装 下一篇WAMP环境配置-Apache服务器的安装

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目