1.memcache简介
memcache是一个高性能、分布式的内存对象缓存系统
一种基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)
2.特点
* 协议简单(使用简单的基于文本行的协议)
* 基于libevent的事件处理(libevent是一个程序库,它将linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口、即时对服务器的连接数增加,也能发挥O(1)的性能)
* 内置内存处理方式(数据全部存储在内存中,重启操作系统会导致数据消失。另外,当内存容量达到指定值之后,就基于LRU算法自动删除不使用的)
* 不互相通信的分布式(memcache尽管是分布式缓存服务器,但是服务器端并没有实现分布式功能。各个memcache不会互相通信以共享信息。至于如何进行分布式则完全取决于客户端的实现,如取余、一致性哈希等)
3.linux下的安装
wget http://memcached.googlecode.com/files/memcached-1.4.10.tar.gz
tar -zxvf memcached-1.x.x.tar.gz
cd memcached-1.x.x
./configure && make && make test && sudo make install
如果报libevent的错,则需要先安装libevent,安装如下
wget http://cloud.github.com/downloads/libevent/libevent/libevent-2.0.16-stable.tar.gz
tar zxvf libevent-2.0.10-stable.tar.gz
./configure -prefix=/usr
make &&make install
测试libevent是否安装成功
ls -al /usr/lib | grep libevent
出来一大列东西,说名都安装好了
4.memcache的启动与参数选项
参数选项:
./memcached -h
-d是启动一个守护进程;
-m是分配给Memcache使用的内存数量,单位是MB;
-u是运行Memcache的用户;
-l是监听的服务器IP地址,可以有多个地址;
-p是设置Memcache监听的端口,,最好是1024以上的端口;
-c是最大运行的并发连接数,默认是1024;
-P是设置保存Memcache的pid文件。
启动
./memcached -p 9200 -m 64m -vv -d
5.memcache基本命令使用
1)set
用于将value存储在指定的key中,如果key已存在,则更新原来的数据
基本语法:
set key flags exptime bytes [noreply]
value
参数说明:
key:键值 key-value 结构中的 key,用于查找缓存值。
flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。
exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
bytes:在缓存中存储的字节数
noreply(可选): 该参数告知服务器不需要返回数据
value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)
eg:
set runoob 0 900 9//缓存900秒,字节最大长度为9
memcached
STORED
get runoob
VALUE runoob 0 9
memcached
END
2)add
将value存储在指定的key中,如果key已存在,则不更新数据(过期的key会更新),响应为NOT_STORED
基本语法:
add key flags exptime bytes [noreply]
value
参数说明同上
eg:
add runoob 0 900 9
3)replace
替换已存在的key和value,
如果key不存在,则替换失败,响应为NOT_STORED
基本语法:
replace key flags exptime bytes [noreply]
value
4)append
向已存在的key和value后面追加数据
基本语法:
append key flags exptime bytes [noreply]
value
参数说明同上
eg:
append tt 0 0 10
5)prepend
向已存在的key和value前面追加数据
基本语法:
prepend key flags exptime bytes [noreply]
value
参数说明同上
eg:
prepend tt 0 0 10
6)cas
check-and-set,用于执行一个检查并设置操作。它仅在当前客户端最后一次取值后,该key对应的值没有被其他客户端修改的情况下,才能够将值写入。检查是通过cas_token参数进行的,这个参数是memcache指定给已经存在的元素的一个唯一的64位值
基本语法:
cas key flags exptime bytes unique_cas_token [noreply]
value
参数说明如下:
key:键值 key-value 结构中的 key,用于查找缓存值。
flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。
exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
bytes:在缓存中存储的字节数
unique_cas_token通过 gets 命令获取的一个唯一的64位值。
noreply(可选): 该参数告知服务器不需要返回数据
value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)
注意:需要先通过get命令获取token
gets命令与get命令功能类似,差异在于,gets返回的信息多一些:64位的整数型版本号
eg:
set tp 0 900 9
memcached
STORED
gets tp
VALUE tp 0 9 1 //最后一位即为token值
memcached
END
cas tp 0 900 5 1//用gets命令获取的token值来进行cas操作
redis
STORED
get tp
VALUE tp 0 5
redis
END
7)delete
删除已存在的key
基本语法:
delete key [noreply]
8)incr、decr
对已存在的key的数字值进行自增或自减操作。该命令操作的数据必须是十进制的32位无符号整数
基本语法:
incr key increment_value
decr key decrement_value
9)stats
用于返回统计信息例如:pid、版本号、连接数等
基本语法:
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:已过期的数据条目来存储新数据的数目
10)flush_all
清理缓存中所有的key-value对
基本语法:
flush_all [time] [noreply]
参数:time可指定在多久之后进行清理
6.memcache&Java
* 添加maven依赖
net.spy
spymemcached
2.12.3
* 获取memcachedClient,然后在client里进行操作
// 本地连接 Memcached 服务
MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("host", port));
mcc.set("test",0,"tt");
...
// 关闭连接
mcc.shutdown();
参考:菜鸟教程 http://www.runoob.com/memcached/memcached-tutorial.html