Memcached
Java 客户端连接 Memcached & Spring 集成
Memcached 简介
Memcached是一个开源、高性能、分布式内存对象缓存系统,同样是一个内存 key-value 数据库,常常用在各种缓存业务上,与 redis 相比,memcached 虽然不支持那么丰富的 value 数据类型,也不支持数据持久化,但是由于结构简洁,在二次开发上更加简单,具有更好的拓展性;
memcached 支持多平台,包括:Linux,FreeBSD,Solaris,Mac OS,Windows 等;
memcached 官网:
http://memcached.org
Memcached 安装配置
以下使用 Ubuntu、Debian 的 apt-get 工具进行快速安装,也可以通过 webget 获取
http://memcached.org/latest 上的源码包自行编译安装;
对于 Rehat 系的 Linux 系统(Fedora,CentOS)对应使用 yum 工具快速安装,基本是一样的;
对于 memcahed 需要安装 libevent 和 memcahed 两个安装包;
$ sudo apt-get update # 更新 apt 库
$ sudo apt-get install libevent # 安装 libevent 的二进制包
$ sudo apt-get install memcached # 安装 memcached 的二进制包
一般 apt-get 安装的可执行程序位于 /usr/bin 目录下,也可以通过 dkpg -L memcached 查看 memcached 包的安装目录,可以直接通过 /user/bin memcached 启动 memcached,也可以将该路径写到系统 PATH 变量中,方便启动;
Memcached 启动和参数
$ memcached # 默认启动 memcached
$ memcached -h # 查看 memcached 启动参数说明
$ memcached -d # 后台启动 memcahed
memcached 含有丰富的启动参数,可以直接在启动 memcached 时输入对应的参数和参数值,也可以通过修改默认配置文件来修改默认启动参数,一般通过 apt-get 安装的默认配置文件在
/usr/share/memcached/memcached.conf.default ,可以通过 dpkg 指令查找该文件的位置;
常用的参数如下:
- -d 以守护进程(后台进程)的方式启动 ;
- -m 分配给 Memcache 使用的内存上限,单位 MB,默认 64;
- -u 运行 Memcache 的用户,默认值 memcache;
- -l 监听的服务器 IP 地址,可以有多个 IP,默认值 127.0.0.1;
- -p 监听的端口,最好设置为 1024 以上的值,默认值 11211;
- -c 最大运行的并发连接数,默认 1024;
- -P 设置保存 Memcache 的 pid文件,当 memcahed 守护进程运行时,相关的 pid 会被写入该文件,需要确保 memcache 有读写该文件的权限;
Memcached 的终端连接
memcached 本身并没有像 Redis 的 redis-cli 那样的终端工具,可以通过系统的 telnet 连接 memcache-server,如下:
$ telnet 127.0.0.1 11211 # 终端连接 memcached
set key1 0 0 5 # 添加键值
assad
STOTRED
get key1 # 获取键值
VALUE assad
END
quit # 推出 telnet 连接
Memcached 常用键值读写指令
可以通过终端连接 memcached,直接对其中储存的键值数据进行操作;
储存指令
set key flags exptime bytes [noreply] value | 设置 key-value,如果 key 已经存在,则覆盖该数据; 返回值 -- STORED:保存成功; ERROR:保存失败 |
add key flags exptime bytes [noreply] value | 设置 key-value,如果 key 已经存在,则不更新数据; 返回值 -- STORED:保存成功; NOT_STORED:保存失败 |
replace key flags exptime bytes [noreply] value | 替换 key-value,如果 key 已经存在,替换为新设置的 value; 返回值 -- STORED:保存成功; NOT_STORED:保存失败 |
append key flags exptime bytes [noreply] value | 后追加 key-value,如果 key 已经存在,则在该 key 的 value 后追加数据; 返回值 -- STORED:保存成功; NOT_STORED:保存失败; CLIENT_ERROR:执行错误 |
prepend key flags exptime bytes [noreply] value | 前追加 key-value,如果 key 已经存在,则在该 key 的 value 前面追加数据 返回值 -- STORED:保存成功; NOT_STORED:保存失败; CLIENT_ERROR:执行错误 |
cas key flags exptime bytes unique_cas_token [noreply] value | 检查并设置 key-value (check-and-set),仅在当前客户端最后一次取值后,该 key 的 value 还没有被客户端修改的情况下,才能将该值写入,检查是通过 unique_cas_token 参数进行的,该参数是由 gets 获取的唯一一个 64 位值; 返回值 -- STORED:保存成功; ERROR:保存失败; EXISTS:在最后一次取值另外一个用户也在更新该数据; NOT_FOUND:不存在该数据; |
以上指令中参数的说明如下:
- key:key 字段;
- flags:可以包括键值对的整型参数,客户端使用该参数值储存键值对以外的信息;
- exptime:在缓存中保存键值对的时间长度,单位秒,0 表示永久;
- bytes:value 在缓存中储存的字节数;
- noreply(可选):告知服务器不需要返回数据;
- value:储存的 value 值(必须位于第二行);
以下是一个使用示例:
# 关于 cas 指令的示例
set user 0 0 5 # 写入 user = assad
assad
STORED
cas user 0 0 5 1 # 检查并写入 user = assad,cas令牌为1
vancy
EXIST # cas 令牌无效
gets user # 获取 user,并返回一个 cas 值
VALUE user 0 5 4 # 该 user 的 cas 值为 4
assad
END
cas user 0 0 5 4 # 通过 gets 获取的 cas 令牌设置 user
vancy
STORED
查找,删除,更改指令
get key1 [ key2 key3 ...] | 获取指定 key 的 value |
gets key1 [ key2 key3 ...] | 获取指定 key 的 value,包括该 key 的 exptime,bytes,和一个 cas 值; |
del key1 [ key2 key3 ...] [noreply] | 删除指定 key |
incr key increment_value decr key decrement_value | 对指定 key 储存的 value执行自增,自减 操作,该 value 必须是十进制32位无符号数值; |
系统统计信息指令
stats | 输出系统统计信息,详细的信息列表说明如下 |
stats sizes | 显示所有 items 的大小、个数 |
stats slabs | 显示各个 slabs 信息,包括 chunk 的大小、数目、使用情况等 |
stats items | 显示各个 slab 中 items 的数目和空闲时长 |
flush_all [time] [noreply] | 清除缓存中的所有键值,time 参数用于设置延迟执行时间,单位s |
stats 指令返回的统计信息列表:
- pid: memcache服务器进程ID
- uptime:服务器已运行秒数
- time:服务器当前Unix时间戳
- version:memcache版本
- pointer_size:操作系统指针大小
- rusage_user:进程累计用户时间
- rusage_system:进程累计系统时间
- curr_connections:当前连接数量
- total_connections:Memcached运行以来连接总数
- connection_structures:Memcached分配的连接结构数量
- cmd_get:get命令请求次数
- cmd_set:set命令请求次数
- cmd_flush:flush命令请求次数
- 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:服务器是否达到过最大连接(0/1)
- listen_disabled_num:失效的监听数
- threads:当前线程数
- conn_yields:连接操作主动放弃数目
- bytes:当前存储占用的字节数
- curr_items:当前存储的数据总数
- total_items:启动以来存储的数据总数
- evictions:LRU释放的对象数目
- reclaimed:已过期的数据条目来存储新数据的数目