目录
EhCache和Guava Cache虽然简单、高效,但是它们都是本地缓存(EhCache可以分布式部署,但是需要依赖Terracotta,显然不利于维护),一般只是用在单个应用程序实例内部。在实际的分布式系统中,缓存更多地用于缓存数据库的热点数据,以减轻数据库负担,常用的分布式缓存有Redis和Memcached。MemCached是一个开源、高性能的分布式内存对象缓存系统,在许多互联网公司都有应用。
1.安装
Memcached可以运行在Linux和Windows平台上,这里以Linux为例。首先需要去官网下载安装包(目前最新的是1.5.12版本):
wget https://memcached.org/latest
然后解压:
tar -zxvf memcached-1.5.12.tar.gz
此时还不能进行安装,需要先安装依赖组件libevent-dev:
sudo apt-get install libevent-dev
然后进入解压后的目录,执行configure文件,这里按照官方示例,只配置了prefix属性,即安装目录:
./configure --prefix=/usr/local/memcached
在memcached安装包解压后的目录下运行以下命令可以查看configure文件的所有可配置项:
./configure --help
然后使用make进行编译和安装:
make && sudo make install
由于Memcached没有自动加环境变量,这里我们在~/.bashrc中配置一下别名:
sudo vim ~/.bashrc
在文件中输入 alias memcached="/usr/local/memcached/bin/memcached"并保存退出。最后刷新一下配置:
source ~/.bashrc
现在可以使用 memcached -h 命令验证是否安装成功,如果能够成功输出帮助信息,说明安装已经成功。
2.使用
2.1 常用选项
首先来看一下memcached提供的一些常用选项。
- -p port 或 --port=<port>:指定监听的TCP端口,默认11211(粗斜体代表可替换内容,下同)
- -U port 或 --udp-port=<port>:指定监听的UDP端口,默认为0,即不开启
- -l host 或 --listen=<host>:指定监听的主机IP地址,如果是本机可以不写
- -u user 或 --user=<user>:设置运行Memcached实例的用户
- -m limit 或 --memory-limit=<limit>:设置存储数据用的内存容量(不包括Memcached本身占用的),单位MB
- -c num 或 --conn-limit=<num>:设置最大连接数,默认1024
- -M 或 --disable-evictions:禁用自动缓存清除(LRU策略),在内存不足时报错
- -P file 或 --pidfile=<file>:将进程PID保存到文件中,必须配合-d选项(开启后台模式)使用
- -t num 或 --threads=<num>:设置Memcached线程数,和Redis不同,Memcached支持多线程,默认为4,建议设置为和本机CPU数量一致
- -L 或 --enable-largepages:启用大内存页,可以提高性能
- -f num 或 --slab-growth-factor=<num>:增长因子,默认1.25
- -R 或 --max-reqs-per-event:单个事件的最大连接数,默认20
- -C 或 --disable-cas:禁用CAS命令,可以减少开销
除此之外还有很多命令,此外,-o 或 --extended 选项还有很多扩展选项,不做详细介绍了。
下面是一个启动Memcached实例的命令:
memcached -d -m 512 -u root -P /usr/local/memcached/memcached.pid
启动之后可以通过 ps -el 看到memcached进程在运行。和Redis不同,Memcached没有提供客户端程序,而是需要使用telnet进行连接:
ubuntu@VM-0-6-ubuntu:~$ telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
2.2 命令格式
Memcached命令的基本格式如下:
command key flags exptime bytes value
含义为:
- command:操作命令,有set、add、get、delete等
- key:缓存数据的键,最大长度250个字符
- flags:用于标识数据序列化格式
- exptime:缓存数据的存活时间,单位为秒,0代表不过期
- bytes:缓存数据的大小,单位为字节
- value:缓存数据的值
2.3 命令
1) set
set命令用来将数据值存储到指定的key中,如果key已存在,则进行更新。设置成功后,会返回STORED。该命令有一个额外的可选选项:noreply,表示不需要服务器返回数据。下面是测试的例子(为了方便阅读,在每组命令之间多打了一个空行,实际是没有的):
set userid 0 0 5
00001
STORED
get userid
VALUE userid 0 5
00001
END
set userid 0 0 5 noreply
00002
get userid
VALUE userid 0 5
00002
END
如果保存失败,会输出ERROR
2) get
get命令可以获取单个或多个key关联的值,上面的例子中演示了单个key的获取,多个key的格式如下:
get key1 key2 ...
3) add
add类似于set,只是如果要设置的key已经存在,则不会更新值,拿Java中的Map来比较,set就是put方法,add就是putIfAbsent方法。命令格式和set也一样。
4) replace
replace仅用于更新值,如果要更新的key不存在,则返回NOT_STORED,否则返回STORED
5)append、prepend
append用于向已存在的数据后面追加值,prepend则相反,用于在数据前面追加值:
add userid 0 0 5
00001
STORED
append userid 0 0 5
00002
STORED
get userid
VALUE userid 0 10
0000100002
END
append或pretend时,bytes字段只需要计算追加部分的长度即可,不需要计算总长度
6)delete
delete命令用于删除指定的缓存数据,数据不存在则返回NOT_FOUND,删除成功返回DELETED,失败返回ERROR
7)incr/decr
incr/decr命令可以对数字值进行修改,令其增大或减少指定数量,命令格式如下:
incr key increment
decr key decrement
示例:
add usercount 0 0 1
1
STORED
incr usercount 100
101
get usercount
VALUE usercount 0 3
101
END
可以看到,如果增加/减少成功,会返回新的数值,并且会自动增大缓存数据的长度,如果key不存在,则返回NOT_FOUND,如果key对应的value不是数值,则返回CLIENT_ERROR,其他错误返回ERROR。
8)CAS操作:cas、gets
CAS是并发领域的常见概念,其原理不需要多介绍。Memcached的cas命令就是在没有其他客户端写入的情况下才进行值的写入,命令格式如下:
cas key flags exptime bytes version
value
这里的versiob需要使用gets命令来获取,gets和get命令使用基本一致,只是返回内容多了一列,即version。完整示例如下:
gets usercount
VALUE usercount 0 3 16
201
END
cas usercount 0 0 3 16
300
STORED
get usercount
VALUE usercount 0 3
300
END
9)统计
统计命令有四个:stats(输出服务器信息)、stats items(输出各slabs中缓存元素的数目及最后一次访问后过去的时间)、stats slabs(显示slab的信息,如chunk大小、数目、占用及空闲情况、命中情况等)、stats sizes(显示所有item的大小和个数)
10)清理
Memcached提供了flush_all命令,可以清除所有缓存数据,还允许延时操作,其命令格式如下:
flush_all [time] [noreply]
time表示多少时间后再执行清除操作,是一个数字,单位为秒