1. Memcached简介
1.1. 什么是Memcached
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。
Memcached基于一个存储键/值对的HashMap,它并不提供冗余(复制其HashMap条目),当某个服务器停止运行或崩溃了,所有存放在服务器上的键/值对都将丢失。但目前Memcached的客户端和代理程序可以提供多服务器的并联方式,可以提供一定的处理能力。
1.2. Memcached与其他分布式缓存的区别
Memcached与其它常用的分布式缓存(例如EhCache、OSCache、JBoss Cache)最主要的区别在于Memcached采用集中式缓存方式(即一台或多台缓存服务器为所有应用系统提供缓存能力),自身不提供集群能力,不提供缓存复制功能;而其他分布式缓存系统采用分布式缓存方式,各个应用系统内部提供数据缓存的能力,多个缓存间采用组播或点对点的方式进行缓存同步。
在性能上来看,Memcached比其它分布式缓存系统低一半以上(未考虑大量数据在其它缓存系统进行复制的影响);但从管理方面来看,Memcached的缓存采用集中管理的模式,应用系统可以水平扩展,而其它分布式缓存在水平扩展的同时,必须同时调整缓存复制策略,一旦应用服务器节点大量扩展,对于缓存服务器间的数据复制将成几何数增加。
2. Memcached安装
本安装过程基于ubuntu 11.10进行,Windows用户直接从http://code.jellycan.com/memcached/上下载最新版本的可执行文件,可以直接跳过安装部分。
2.1. 下载Memcached的源码
从官网(http://www.memcached.org)上下载最新版本的Memcached源码,本文编写时,最新版本为memcached-1.4.13.tar.gz,下面说明均以此版本为例说明。
2.2. 下载依赖类库
Memcached编译需要libevent的支持,从官网(http://libevent.org/)下载最新版本。本文编写时,最新版本为libevent-2.0.17-stable.tar.gz。
Magent是memcached的代理程序,可以有效降低memcached单点故障导致程序异常的可能性,从官网(http://code.google.com/p/memagent/)下载最新版本。
备注:Moxi(http://labs.northscale.com/moxi/)是另一个memcached缓存的代理程序,因官网无法访问,没有进行测试。
2.3. 编译
1. 编译libevent
tar zxvf libevent-2.0.17-stable.tar.gz
cd libevent-2.0.17-stable/
./configure --prefix=/usr
make
sudo make install
#测试libevent是否安装成功
ls -al /usr/lib | grep libevent
2. 编译memcached
tar zxvf memcached-1.2.13.tar.gz
cd memcached-1.2.13/
./configure --with-libevent=/usr
make
sudo make install
cd ../
#测试memcached是否安装成功
ls -al /usr/local/bin | grep memcached
3. 编译magent
tar zxvf magent-0.5.tar.gz
sudo /sbin/ldconfig
sed -i "s#LIBS = -levent#LIBS = -levent -lm#g" Makefile
make
cp magent /usr/bin/magent
cd ../
在ubuntu下,make过程或报错,修改magent.c,加入以下内容即可。
#include <limits.h>
3. 简单示例
3.1. 启动memcached
memcached -m 1 -u root -d -l 127.0.0.1 -p 11211 -P /home/liumz/logs/1.log
memcached -m 1 -u root -d -l 127.0.0.1 -p 11212 -P /home/liumz/logs/2.log
memcached -m 1 -u root -d -l 127.0.0.1 -p 11213 -P /home/liumz/logs/3.log
分别在11211、11212、11213端口启动3个Memcached进程。
具体启动命令参数参见4.1. 启动命令。
3.2. 启动magent
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:11213
在12000端口开启magent代理程序,11211、11212端口为主Memcached,11213端口为备份Memcached。
连接上12000的magent,set key1和set key2,根据哈希算法,key1被写入11212和11213端口的Memcached,key2被写入11212和11213端口的Memcached。
当11211、11212端口的Memcached死掉,连接到12000端口的magent取数据,数据会从11213端口的Memcached取出。
当11211、11212端口的Memcached重启复活,连接到12000端口,magent会从11211或11212端口的 Memcached取数据,由于这两台Memcached重启后无数据,因此magent取得的将是空值,尽管11213端口的Memcached还有数 据。
3.3. Memcached基本操作实例
本实例以直连memcached进行,magent的操作与memcache的操作一致,但具体部分返回结果所有差别。详细操作见4.2 操作命令。
# 连接memcached
telnet 127.0.0.1 11211
# 新增数据
set key1 0 0 3
abc
# 查询数据
get key1
# 服务器状态
stats
# 删除数据
delete key1
# 退出
quit
4. 附录
4.1. 启动命令
下表仅列出比较常用的参数,更多参数使用memcached –h进行查看。
参数
说明
-p <num>
TCP侦听端口号(默认不设置为: 11211)
-U <num>
UDP侦听端口 (默认: 11211, 0 时关闭)
-l <ip_addr>
绑定地址 (默认:所有都允许,无论内外网或者本机更换IP,有安全隐患,若设置为127.0.0.1就只能本机访问)
-r
最大的核心文件数(maximize core file limit)
-d
独立进程运行
-u <username>
绑定使用指定用于运行进程 <username>
-m <num>
允许最大内存用量,单位M (默认: 64 MB)
-M
内存使用超出后,返回错误信息(而不是删除存储对象)
-c <num>
最大的请求数(默认:1024)
-h
显示帮助信息
-P <file>
将PID写入文件<file>,这样可以使得后边进行快速进程终止, 需要与 -d 一起使用
文件名必须为全路径
在linux下
./usr/local/bin/memcached -d -u root -l 192.168.1.197 -m 2048 -p 12121
在window下
d:\ memcached\memcached.exe -d RunService -l 127.0.0.1 -p 11211 -m 500
在windows下注册为服务后运行:
sc.exe create memcached binpath= “d:\ memcached\memcached.exe -d RunService -p 11211 -m 500” start= auto
net start memcached
4.2. 操作命令
1. 写入数据
<command name> <key> <flags> <exptime> <bytes>\r <data block>\r
其中“\r”表示回车换行
n <command name> 可以是”set”, ”add”, ”replace”
“set”表示按照相应的<key>存储该数据,没有的时候增加,有的覆盖。
“add”表示按照相应的<key>添加该数据,但是如果该<key>已经存在则会操作失败。
“replace”表示按照相应的<key>替换数据,但是如果该<key>不存在则操作失败。
n <key> 客户端需要保存数据的key
n <flags> 是一个16位的无符号的整数(以十进制的方式表示)
该标志将和需要存储的数据一起存储,并在客户端get数据时返回。
客户可以将此标志用做特殊用途,此标志对服务器来说是不透明的。
n <exptime> 过期的时间
若为0表示存储的数据永远不过时(但可被服务器算法:LRU等替换)。
如果非0(unix时间或者距离此时的秒数),当过期后,服务器可以保证用户得不到该数据(以服务器时间为标准)。
n <bytes> 需要存储的字节数(不包含最后的”\r”)
当用户希望存储空数据时,<bytes>可以为0,最后客户端需要加上”\r”作为”命令头”的结束标志。
n <data block>\r 数据内容
紧接着”命令头”结束之后就要发送数据块(即希望存储的数据内容),最后加上”\r”作为此次通讯的结束。
2. 获取数据
get <key>*\r
n <key>* 表示一个或者多个key(以空格分开)
n “\r” 命令头的结束
3. 删除数据
delete <key> <time>\r
n <key> 需要被删除数据的key
n <time> 客户端希望服务器将该数据删除的时间(unix时间或者从现在开始的秒数)
n “\r” 命令头的结束
4. 检查服务器状态
stats\r
可以看到memcache的获取次数,当前连接数,写入次数等;
指标
说明
pid
进程ID
uptime
服务器运行秒数
time
服务器当前unix时间戳
version
服务器版本
pointer_size
操作系统字大小
rusage_user
进程累计用户时间
rusage_system
进程累计系统时间
curr_connections
当前打开连接数
total_connections
曾打开的连接总数
connection_structures
服务器分配的连接结构数
cmd_get
执行get命令总数
cmd_set
执行set命令总数
cmd_flush
指向flush_all命令总数
get_hits
get命中次数
get_misses
get未命中次数
delete_misses
delete未命中次数
delete_hits
delete命中次数
incr_misses
incr未命中次数
incr_hits
incr命中次数
decr_misses
decr未命中次数
decr_hits
decr命中次数
cas_misses
cas未命中次数
cas_hits
cas命中次数
cas_badval
使用擦拭次数
auth_cmds
认证请求次数
auth_errors
认证错误次数
bytes_read
读取字节总数
bytes_written
写入字节总数
limit_maxbytes
分配的内存数(字节)
accepting_conns
目前接受的链接数
listen_disabled_num
threads
线程数
conn_yields
bytes
存储item字节数
curr_items
item个数
total_items
item总数
evictions
为获取空间删除item的总数
缓存命中率 = get_hits/cmd_get * 100%
5. 高级缓存细节查看
n 清空统计数据
stats reset
n 显示各个slab的信息
stats slabs
n 显示各个slab中item的信息
stats items
n 显示某个slab中的前limit_num个key列表
stats cachedump slab_id limit_num
显示格式如下
ITEM key_name [ value_length b; expire_time|access_time s]
其中,memcached 1.2.2及以前版本显示的是访问时间(timestamp),1.2.4(含)以上版本,显示过期时间(timestamp)。
如果是永不过期的key,expire_time会显示为服务器启动的时间
例如:
stats cachedump 1 10
ITEM key1 [250 b; 1207795754 s]
ITEM key2 [248 b; 1207793649 s]
n 设置或者显示详细操作记录
stats detail [on|off|dump]
参数为on,打开详细操作记录
参数为off,关闭详细操作记录
参数为dump,显示详细操作记录(每一个键值get、set、hit、del的次数)
stats detail只对key中带前缀有效,即key必须为“xxx:yyy”,统计数据则为xxx的实际情况。
6. 清空所有键值
flush_all
注:flush并不会将items删除,只是将所有的items标记为expired,因此这时memcache依旧占用所有内存。
7. 退出
quit\r