Java开发中的Memcache原理及实现
作者:jiaxiaoyuan1204
整理:chaijunkun
来源:jiaxiaoyuan1204.blog.163/
一、概述
1. Memcache是什么
Memcache(Memcached)是集环境下的缓存解决方案。
Memcache是danga的一个项目,最早是为LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。它可以应对任意多个连接,使用非阻塞的网络IO。它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached自管理这些HashTable。
Memcache:www.danga/memcached,更多详细的信息可以来这里了解。
2. 为什么会有Memcache和memcached两种名称
其实Memcache是这个项目的名称,而memcached是它服务器端的主程序文件名,知道我的意思了吧。一个是项目名称,一个是主程序文件名,在网上看到了很多人不明白,于是混用了。
3. 如何在Java开发中使用Memcache
在Java开发中使用Memcache,一般要用到以下几个程序:
1) Memcached
该程序用来在Linux或Windows服务器上建立和管理缓存。
其项目网址为:danga/memcached/。
2) Magent
Magent是一款开源的Memcached代理服务器软件,使用它可以搭建高可用性的集应用的Memcached服务,其项目网址为:le/p/memagent/。
3) Memcached客户端程序
至于Memcached的客户端程序,一般推荐用memcached client for java,为什么推荐用这种客户端,后
session下载面会讲到具体的原因,其项目的网址为:
github/gwhalin/Memcached-Java-Client/。
4)其它程序
i. Libevent
在Linux环境下应用Memcache时,Memcache用到了libevent这个库,用于Socket的处理,所以还需要安装libevent。libevent的最新版本是libevent-1.4.13。(如果你的系统已经安装了libevent,可以不用安装)。
:/~provos/libevent/
下载:/~provos/libevent-1.4.
ii. Windows下的安装程序
Memcache也可以安装在Windows服务器下,安装程序:memcached-1.2.1-win32.zip
可以从这里下载:/projects/memcached-win32/。
二、服务器端安装
1. 编译安装libevent
wget /~provos/libevent-1.4.
tar  zxvf  libevent-1.4.
cd  libevent-1.4.9-stable/
./configure  --prefix=/usr
make &&  make install
cd  ../
2. 编译安装Memcached
Memcached的最新版本是1.4.5,安装包为:memcached-1.4.。
wget lecode/files/memcached-1.4. tar  zxvf  memcached-1[1].4.
cd  memcached-1.4.5/
./configure  --with-libevent=/usr
make && make install
cd ../
3. 编译安装magent
Magent的最新版本是0.6,安装包为:magent-0.。
mkdir  magent
cd  magent/
wget  lecode/files/magent-0.
tar  zxvf  magent-0.
/sbin/ldconfig
sed -i "s#LIBS = -levent#LIBS = -levent -lm#g" Makefile
make
cp  magent  /usr/bin/magent
cd  ../
三、启动和结束服务
1. 启动一个Memcache的服务器端
进入到memcached的安装目录,如:
#cd /usr/local/memcached-1.4.5
# ./memcached -d -m 10 -u root -l 10.11.15.222 -p 12000 -c 256 -P /tmp/memcached.pid ?  -d  选项是启动一个守护进程,
?  -m  是分配给Memcache使用的内存数量,单位是MB,我这里是10MB,
?  -u  是运行Memcache的用户,我这里是root,
?  -l  是监听的服务器IP地址,我这里指定了服务器的IP地址10.11.15.222,
?  -p  是设置Memcache监听的端口,我这里设置了12000,最好是1024以上的端口,?  -c  是最大运行的并发连接数,默认1024,这里设置了256,按照服务器的负载量来设定,
?  -P  是设置保存Memcache的pid文件,我这里是保存在/tmp/memcached.pid,2. 结束一个Memcache进程
如果要结束Memcache进程,执行:
# kill `cat /tmp/memcached.pid`
?  注意,上面命令中的符号是`,不是单引号’
也可以启动多个守护进程,不过端口不能重复。
3. 启动Magent代理
Magent已保存到/usr/bin目录下,可以直接执行该命令。如:
#magent -u root -n 51200 -l 127.0.0.1 -p 12000 -s 127.0.0.1:11211 -s 127.0.0.1:11212 -b 127.0.0.1:112
13
命令参数:
?  -h  this message
?  -u  uid
?  -g  gid
?  -p  port, default is 11211. (0 to disable tcp support)
?  -s  ip:port, set memcached server ip and port
?  -b  ip:port, set backup memcached server ip and port
?  -l  ip, local bind ip address, default is 0.0.0.0
?  -n  number, set max ...
四、原理与部署
1. magent的hash算法
magent采用的是:Consistent Hashing原理,Consistent Hashing如下所示:首先求出memcached服务器(节点)的哈希值,并将其配置到0~232的圆(continuum)上。然后用同样的方法求出存储数据的键的哈希值,并映射到圆上。然后从数据映射到的位置开始顺时针查,将数据保存到到的第一个服务器上。如果超过232仍然不到服务器,就会保存到第一台memcached服务器上。
从上图的状态中添加一台memcached服务器。余数分布式算法由于保存键的服务器会发生巨大变化而影响缓存的命中率,但Consistent Hashing中,只有在continuum上增加服务器的地点逆时针方向的第一台服务器上的键会受到影响。
2. 部署示意图
3. 搭建memcache集服务
利用magent实现对memecache的分布式管理,搭建一套memcache集服务:
?  前端java对magent的访问跟对memcache访问相同,不需要做任何更改,对于插入的key,magent会把值散列到各个memcache服务上,只操作magent,不用关心后端处理;
?  项目应用:以深圳电信为例,其商呼系统如图部署三台机器做为集,假设IP分别是:10.11.15.31,10.11.15.32,10.11.15.33;
?  每个前端安装memcached服务(大内存机器可以启动多个服务),如端口都为12001,每个前端都安装magent服务,端口都为12000,后端挂载全部机器的memcached服务,?  启动参数示例:magent -p 12000 -s 10.11.15.31:12001 -s 10.11.15.32:12001 -s
10.11.15.33:12001,这里将三台机器都配置进来,如集集增加了机器,只需要在启动参数里添加进来即可。所有前端配置都是相同的,任何一个前端只需访问本地端口的magent,这样的memcache集对应用带来很大便利。
?  这种部署可以解决session共享的应用

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。