通过telnet访问memcached服务器

telnet   <server> <port>

在下面的文章中 “\r\n”之间的内容是需要在telnet终端里输入的内容

如果memcached服务器返回ERROR或者CLIENT_ERROR,说明是命令没有执行成功,如果服务器返回SERVER_ERROR则说明是memcached服务有问题。

命令分为:

1.检索命令 get、gets

2.存储命令 set、add、replace、append、prepend、cas

3.删除命令 delete

4.递增/递减命令 incr、decr

5.touch 

6.统计命令 stats

7.杂项命令 flush_all、version、verbosity、quit

命令格式:<command> <key> <flags> <exptime> <bytes>  \r\n<data block>\r\n

一.检索命令

参数:

<key> :需要检索数据的键名
<key>*:一次检索多个键,用空格分开
返回值 :

VALUE <flag> <bytes> \r\n<data>
这些命令有 get gets
1.get a

VALUE a 0 2 aa END

2.gets a b

VALUE a 0 0 3972 VALUE b 0 2 3971 bb END

二.存储命令

参数:

<key>  : 缓存数据的键 其长度不能超过250个字符

<flags>: 32位无符号整数(由用户提供),和键要存储的数据一起存储,并在程序get缓存时返回。

<exptime>:过期时间(单位为秒),0 表示永远不过期,可使用 unix 时间戳格式或距离当前时间的秒数,设为秒数时不能大于 2592000(30 天)

<bytes> : 存储数据的字节数,当用户希望存储空数据时,<bytes>可以为0

<cas unique> :  是一个与已存数据条目相关的全局唯一的64位数。客户端应该使用"gets"命令返回的该值来进行"cas"更新操作。

[noreply]  : 可选项指示服务器不要回送响应。注意:如果请求行格式错误,服务器不一定能可靠地解析"noreply"选项。在此种情况下,它可能会发送错误信息给客户端,如果客户端没有读取该信息的话会带来问题。客户端应该只构造合法的请求。



返回值:

STORED  : 存储成功

NOT_STORED  : 数据存储失败,可以是由于不符合add或replace的条件,或者项目在删除队列中

EXISTS  : 使用cas命令储存的项目已经在上次获取时更改

NOT_FOUND : 项目不存在或已经被删除



命令:

1.Set

   在memcached中存储键/值

格式: set <key> <flags> <exptime> <bytes> [noreply]\r\n<value>\r\n

set a 0 900 4
data
STORED

2.Add

     同set,但是只有当键中没有数据或健不存在时才能存储。

格式 : add <key> <flags> <exptime> <bytes> [noreply]\r\n<value>\r\n

add b 0 900 2
10
STORED

3.Replace

     替换已经存在的键中的数据

格式 : replace <key> <flags> <exptime> <bytes> [noreply]\r\n<value>\r\n

replace a 0 900 2
10
STORED

4.Append

     向键中数据后面增加数据

Append 不会改变 <flags> 和 <exptime>,但是要提供这两个参数

格式: append <key> <flags> <exptime> <bytes> [noreply]\r\n<value>\r\n

append a 0 900 2
10
STORED

5.Prepend

     向键数数据前面增加数据

同样的prepend不会改变 <flags> 和 <exptime>,但是也要提供这两个参数

格式: prepend <key> <flags> <exptime> <bytes> [noreply]\r\n<value>\r\n

prepend a 0 900 2
10
STORED

6.Cas

    当数据从上次获取后没有被其它程序修改过的时候才存储,网上找到一段说明:

如果首先通过get命令获取了一个item,修改了它,然后再把它set回memcached,系统不保证这个item没有被其他进程(process,未必是操作系统中的进程)操作过。memcached 1.2.5以及更高版本,提供了gets和cas命令,它们可以解决上面的问题。如果使用gets命令查询某个key的item,memcached会返回该item当前值的唯一标识。如果客户端程序覆写了这个item并想把它写回到memcached中,可以通过cas命令把那个唯一标识一起发送给memcached。如果该item存放在memcached中的唯一标识与您提供的一致,写操作将会成功。如果另一个进程在这期间也修改了这个item,那么该item存放在memcached中的唯一标识将会改变,写操作就会失败。



格式 : cas <key> <flags> <exptime> <bytes> <cas unique> [noreply]\r\n

cas b 0 900 2 <cas unique>
10
STORED

三。删除命令

参数:

<key> : 要删除的键

[<time>] : 可选,过多久删除,单位是秒

[noreply] : 可选,告诉server不要回送响应



返回值 :

DELETED  :删除成功

NOT_FOUND:键值不存在或已删除



Delete



格式: delete <key> [<time>] [noreply]\r\n


delete a
DELETED


四。递增/递减命令

参数 :

<key> :  要操作的键

<value> : 要加或减的值

[noreply] : 可选,告诉server不要回送响应



返回值 :

NOT_FOUND 键/值不存在

<value>  加减后的结果



1.递增 incr

     操作的键/值必须存在,因为incr命令不会自动创建键/值。数据应该是64位的无符号整数(以十进制表示),如果数据不是整数,memcached会报错

格式 : incr <key> <value> [noreply]\r\n

get a
11
incr a 12
23



2.递减 decr



与递增一样,键/值必须存在,如果递减后的值小于0,则会显示0

格式: decr <key> <value> [noreply]\r\n

decr key 12
44


五.touch 命令

参数 :

<key> : 操作的键

<exptime> : 过期时间

[noreply] : 可选,告诉server不要回送响应



返回值:

NOT_FOUND 键/值不存在或已经删除

TOUCHED    过期时间更新成功



Touch

touch命令可以直接更新已经存在的键/值的过期时间,而不用读取它

格式 : touch <key> <exptime> [noreply]\r\n

touch key 1800
TOUCHED


六.统计命令

参数 :

<args> : stats 命令的参数。

stats

基本统计信息

显示服务器信息运行时间,版本等



stats reset

清空统计数据



stats malloc

显示内存分配数据



stats slabs

显示各个slab的信息,包括chunk的大小、数目、使用情况等



stats items

显示各个slab中item的数目和最老item的年龄(最后一次访问距离现在的秒数)



stats detail [on|off|dump]

设置或者显示详细操作记录



参数为on,打开详细操作记录

参数为off,关闭详细操作记录

参数为dump,显示详细操作记录(每一个键值get、set、hit、del的次数)



stats cachedump slab_id limit_num

显示某个slab中的前limit_num个key列表,显示格式如下

ITEM key_name [ value_length b; expire_time|access_time s]


七。杂项命令

1.Flush_all

      这个指令执行后,服务器上所有缓存的数据都被删除,并且返回:OK。flush并不会将items删除,只是将所有的items标记为expired

格式: flush_all [<time>] [noreply]\r\n


flush_all 10
OK

2.Version

返回memcached的版本

格式: version\r\n

version
VERSION 1.4.5

3.Verbosity

设置详细的日志输出级别,总是返回OK(除非加了noreply 参数)

格式: verbosity <level> [noreply]\r\n

verbosity 2
OK

4.Quit

memcached服务器关闭连接。

参考文章:

http://code.google.com/p/memcached/wiki/NewStart
https://github.com/memcached/memcached/blob/master/doc/protocol.txt
http://www.blogjava.net/chhbjh/archive/2012/02/21/370472.html
http://blog.elijaa.org/index.php?post/2010/05/21/memcached-telnet-command-summary