memcached:Memcached 的使用和协议分析详解

  Memcached 是danga.com个项目最早是为 LiveJournal 服务目前全世界不少人使用这个缓存Cache项目来构建自己大负载网站WebSite来分担数据库压力(有关Memcache更多信息请Google)

  Memcache官方网站WebSite:http://www.danga.com/memcached

  【安装 Memcached 服务器端】

  我目前平台服务器是Fedora Core 1(内核:2.4.22)客户端是Windows XP SP2需要安装就是服务器Memcached守护进程和客户端PHP扩展php_memcache两个东西现在我分别来讲

  服务器端主要是安装memcache服务器端目前最新版本是 memcached-1.2.0

  下载:http://www.danga.com/memcached/dist/memcached-1.2.0.tar.gz

  另外Memcache用到了libevent这个库用于Socket处理所以还需要安装libeventlibevent最新版本是libevent-1.2(如果你系统已经安装了libevent可以不用安装)

  官网:http://www.monkey.org/~provos/libevent/

  下载:http://www.monkey.org/~provos/libevent-1.2.tar.gz

  我分别把两个东东下载回来放到 /tmp 目录下:

# cd /tmp
# wget http://www.danga.com/memcached/dist/memcached-1.2.0.tar.gz
# wget http://www.monkey.org/~provos/libevent-1.2.tar.gz


  先安装libevent:

# tar zxvf libevent-1.2.tar.gz
# cd libevent-1.2
# ./configure --prefix=/usr
# make
# make


  然后看看我们libevent是否安装成功:

# ls -al /usr/lib | grep libevent
lrwxrwxrwx  1 root   root     21 11?? 12 17:38 libevent-1.2.so.1 -> libevent-1.2.so.1.0.3
-rwxr-xr-x    1 root   root     263546 11?? 12 17:38 libevent-1.2.so.1.0.3
-rw-r--r--    1 root   root     454156 11?? 12 17:38 libevent.a
-rwxr-xr-x   1 root   root     811 11?? 12 17:38 libevent.la
lrwxrwxrwx  1 root   root     21 11?? 12 17:38 libevent.so -> libevent-1.2.so.1.0.3


  还不错都安装上了再来安装memcache同时需要安装中指定libevent安装位置:

# cd /tmp
# tar zxvf memcached-1.2.0.tar.gz
# cd memcached-1.2.0
# ./configure --with-libevent=/usr
# make
# make


  如果中间出现报错请仔细检查信息按照信息来配置或者增加相应库或者路径

  安装完成后会把memcached放到 /usr/local/bin/memcached 我们看以下是否安装了:

# ls -al /usr/local/bin/mem*
-rwxr-xr-x  1 root   root    137986 11?? 12 17:39 /usr/local/bin/memcached
-rwxr-xr-x  1 root   root    140179 11?? 12 17:39 /usr/local/bin/memcached-debug


  恩安装完成了现在我们看以下memcache帮助:

# /usr/local/bin/memecached -h
memcached 1.2.0
-p <num>      port number to listen _disibledevent= $mem->get('key2');
echo "Get key2 value: ";
pr_r($val2);
echo "<br>";


  【Memcache协议分析】

  如果你不喜欢 php_memcache.dll 扩展或者服务器器目前不支持这个扩展那么就可以考虑自己构建需要构建Memcahe客户端要先了解Memcache协议交互这样才能开发自己客户端我这里就简单分析以下Memcache协议

  (更详细协议内容请在Memcache服务器端源码 doc/protocol.txt 文件中本文基本来源于此)

  Memcache既支持TCP协议也支持UDP协议不过我们这里是以TCP协议协议作为主要考虑对象想了解UDP协议过程请参考 doc/protocol.txt 文件

  [ 指令]

  Memcache协议部分主要是 3个提示的提示指令:

  普通信息比如指令的类

  ERRORrn

  客户端

  CLIENT_ERROR <信息>rn

  服务器端

  SERVER_ERROR <信息>rn

  [ 数据保存指令]

  数据保存是基本功能就是客户端通过命令把数据返回过来服务器端接收后进行处理

  指令格式:

  <命令> <键> <标记> <有效期> <数据长度>rn

  <命令> - command name

  主要是 3个储存数据 3个命令 , add, replace

   命令是保存个叫做key数据到服务器上

  add 命令是添加个数据到服务器但是服务器必须这个key是不存在能够保证数据不会被覆盖

  replace 命令是替换个已经存在数据如果数据不存在就是类似功能

  <键> - key

  就是保存在服务器上唯个表示符必须是跟其他key不冲突否则会覆盖掉原来数据这个key是为了能够准确存取个数据项目

  <标记> - flag

  标记是个16位无符号整形数据用来设置服务器端跟客户端些交互操作

  <有效期> - expiration time

  是数据在服务器上有效期限如果是0则数据永远有效单位是秒Memcache服务器端会把个数据有效期设置为当前Unix时间+设置有效时间

  <数据长度> - s

  数据长度block data 块数据长度般在这个个长度结束以后下行跟着block data数据内容发送完数据以后客户端般等待服务器端返回服务器端返回:

  数据保存成功

  STOREDrn

  数据保存失败般是服务器端这个数据key已经存在了

  NOT_STOREDrn

  [ 数据提取命令]

  从服务器端提取数据主要是使用get指令格式是:

  get <键>*rn

  <键>* - key

  key是是个不为空串组合发送这个指令以后等待服务器返回如果服务器端没有任何数据则是返回:

  ENDrn

  证明没有不存在这个key没有任何数据如果存在数据则返回指定格式:

  VALUE <键> <标记> <数据长度>rn

  <数据块>rn

  返回数据是以VALUE开始后面跟着key和flags以及数据长度第 2行跟着数据块

  <键> -key

  是发送过来指令key内容

  <标记> - flags

  是指令保存数据时候flags标记

  <数据长度> - s

  是保存数据时候定位长度

  <数据块> - data block

  数据长度下行就是提取数据块内容

  [ 数据删除指令]

  数据删除指令也是比较简单使用get指令格式是:

  delete <键> <超时时间>rn

  <键> - key

  key是你希望在服务器上删除数据key键

  <超时时间> - timeout

  按照秒为单位这个是个可选项如果你没有指定这个值那么服务器上key数据将马上被删除如果设置了这个值那么数据将在超时时间后把数据清除该项缺省值是0就是马上被删除

  删除数据后服务器端会返回:

  DELETEDrn

  删除数据成功

  NOT_FOUNDrn

  这个key没有在服务器上找到

  如果要删除所有服务器上数据可以使用flash_all指令格式:

  flush_allrn

  这个指令执行后服务器上所有缓存Cache数据都被删除并且返回:

  OKrn

  这个指令般不要轻易使除非你却是想把所有数据都干掉删除完以后可以无法恢复

  [其他指令]

  如果想了解当前Memcache服务器状态和版本等信息可以使用状态查询指令和版本查询指令

  如果想了解当前所有Memcache服务器运行状态信息可以使用stats指令格式

  statsrn

  服务器将返回每行按照 STAT 开始状态信息包括20行20项左右信息包括守护进程pid、版本、保存项目数量、内存占用、最大内存限制等等信息

  如果只是想获取部分项目信息可以指定参数格式:

  stats <参数>rn

  这个指令将只返回指定参数项目状态信息

  如果只是想单独了解当前版本信息可以使用version指令格式:

  versionrn

  将返回以 VERSION 开头版本信息

  如果想结束当前连接使用quit指令格式:

  quitrn

  将断开当前连接

  另外还有其他指令包括incr, decr 等我也不太了解作用就不做介绍了如果感兴趣可以自己去研究

  【Memcache在中型网站WebSite使用】

  使用Memcache网站WebSite般流量都是比较大为了缓解数据库压力让Memcache作为个缓存Cache区域把部分信息保存在内存中在前端能够迅速进行存取那么焦点就是集中在如何分担数据库压力和进行分布式毕竟单台Memcache内存容量有限我这里简单提出我个人看法未经实战权当参考

  [ 分布式应用]

  Memcache本来支持分布式我们客户端稍加改造更好支持我们key可以适当进行有规律封装比如以user为主网站WebSite来说每个用户都有User ID那么可以按照固定ID来进行提取和存取比如1开头用户保存在第台Memcache服务器上以2开头用户数据保存在第 2胎Mecache服务器上存取数据都先按照User ID来进行相应转换和存取

Tags:  javamemcached memcachedserver phpmemcached memcached

延伸阅读

最新评论

发表评论