参数列表
-p <num> | TCP port number to listen on (default: 11211) | 监听的TCP端口号 |
-U <num> | UDP port number to listen on (default: 0, off) | UDP端口号 |
-s <file> | unix socket path to listen on (disables network support) | socket文件,一旦指定,关闭网络模式 |
-a <mask> | access mask for unix socket, in octal (default 0700) | socket文件访问权限 |
-l <ip_addr> | interface to listen on, default is INDRR_ANY | 监听的地址,指定的话只响应该地址请求 |
-d | run as a daemon | 后台进程模式 |
-r | maximize core file limit | dump core file 的大小限制 |
-u <username> | assume identity of <username> (only when run as root) | |
-m <num> | max memory to use for items in megabytes, default is 64 MB | |
-M | return error on memory exhausted (rather than removing items) | 没有逐出,内存用完就不能再往里加 |
-c <num> | max simultaneous connections, default is 1024 | 最大链接数 |
-k | lock down all paged memory. Note that there is a limit on how much memory you may lock. Trying to allocate more than that would fail, so be sure you set the limit correctly for the user you started the daemon with (not for -u <username> user; under sh this is done with 'ulimit -S -l NUM_KB'). | 锁定内存使之不会被swap到虚存,保证性能 |
-v | verbose (print errors/warnings while in event loop) | |
-vv | very verbose (also print client commands/reponses) | 调试时很有用 |
-h | print this help and exit | |
-i | print memcached and libevent license | |
-b | run a managed instanced (mnemonic: buckets) | ?? |
-P <file> | save PID in <file>, only used with -d option | 指定进程号存放文件 |
-f <factor> | chunk size growth factor, default 1.25 | chunk大小增长系数 |
-n <bytes> | minimum space allocated for key+value+flags, default 48 | 第一个chunk的大小(不含item结构) |
协议要点(针对文本协议)
- 建议客户端缓存TCP链接以节省创建的开销
- 协议中有两种类型的数据:文本和非结构化数据,前者用来表示命令或服务端客户端交互,后者用来表示被缓存的数据。所以服务端不去管客户端存进来的是什么,当客户端来取时,只是以字节流的形式原样返还。
- 上述两种数据类型都会以'\r\n'结束,由于被缓存的对象里也有可能含有\r\n,所以客户端应该以数据长度作为对象结束的依据,而不是\r\n
- key用来标识存进memcached的对象,key是一个长度小于250的字串,且不能含有控制字符或空格
- 一些命令中可以有过期时间,这个时间是一个整数值,如果大于60*60*24*30(30天),它将被作为一个Unix时间
- 错误代码一共有三种
- "ERROR\r\n" 表示客户端发送了一个不存在的命令
- "CLIENT_ERROR <error>\r\n" 表示客户端的命令格式不正确
- "SERVER_ERROR <error>\r\n" 表示服务端错误。当严重的错误发生时,服务端在发送完这个响应后会关闭链接
- 以下是命令的格式,所有的命令都是大小写敏感的
存储命令
set|add|replace|append|prepend <key> <flags> <exptime> <bytes> [noreply]\r\n
或
cas <key> <flags> <exptime> <bytes> <cas unqiue> [noreply]\r\n
后跟
<data block>\r\n
命令说明:
- set: 置值
- add: 如果不存在,置值
- replace: 如果存在,置值
- append: 如果存在,在原值后添加
- prepend: 如果存在,在原值前添加
- cas: check and set,检查并置值,确保在上次获取值后没有被置过值
参数说明:
- <flags>: 一个16-bit无符号整数(1.2.1以后版本为32-bit),每次取操作时会随数据返回,客户端可以用它来作位图标识一些数据的属性(如是否压缩过,是否序列化过等等),这个值是服务端透明的,服务器只是原样返回
- <bytes>: <data block>的长度,不含\r\n
- <cas unique>: 一个随gets命令返回的32位整数,标识这个对象被置值的次数
- noreply: 让服务端沉默
返回说明:
- "STORED\r\n": 成功
- "NOT_STORED\r\n": add了已存在的,replace|append|prepend了不存在的,或者该对象已经在删除队列中了
- "EXISTS\r\n":cas方法要设置的对象已经被更改了
- "NOT_FOUND\r\n":cas方法要设置的对象不存在或者已经被删除了
取回命令
get <key>*\r\n
gets <key>*\r\n
命令说明:
- get 取得一个或多个对象by keys
- gets 取得一个或多个对象(包括其cas_id)by keys
参数说明:
- <key>* 一个key或空格分隔的多个key
返回说明:
VALUE <key> <flags> <bytes> [<cas unique>]\r\n
<data block>\r\n
...
END\r\n
删除命令
delete <key> [<time>] [noreply]\r\n
参数说明:
- <time> 以秒计的间隔或系统时间,在这个时间之前,对象会被扔到删除对列中。对该对象的get,add,replace操作将会被失败,但set会成功。这是个可选参数,默认为0,表示不放到队列中而直接删除(free chunk)
返回说明:
- "DELETED\r\n" 成功
- "NOT_FOUND\r\n" 未找到
递增递减命令
incr <key> <value> [noreply]\r\n
decr <key> <value> [noreply]\r\n
命令说明:
- 这两个命令是原子操作
- 这两个操作的前提是这个key存在且其值是一个有效的64-bit无符号整数的十进制表示(在内部存储时,其实是用的字符串)
- decr至0后,再decr不会有效果。但incr到最大值后会溢出
参数说明:
- <value>: 期望增减的值,64-bit无符号整数的十进制表示
返回说明:
- "NOT_FOUND\r\n" 找不到
- <value>\r\n , 增减后新的值
统计命令
stats\r\n : 全局统计
stats slabs\r\n : 统计slabs的使用情况
stats items\r\n : 统计各slab class中的item的情况
stats sizes\r\n : 统计每个大小档次中item数量(需要遍历所有item,慎用)
其他命令
flush_all [<delay>]\r\n : 将所有对象置为不可获取状态,即全清,慎用。delay以秒计,没有表示马上执行
version\r\n : 返回server版本
verbosity <level>\r\n : 调整server的日志输出level:0|1|2,2最详细
quit\r\n : 告诉server关闭此链接
典型用例
问题与解决方案
相关讨论贴
潜入memcached server http://www.javaeye.com/topic/225692
看看mina和memcached的联姻(适合不同语言客户端,高并发?http://www.javaeye.com/topic/217165
分布式缓存系统Memcached学习心得 http://www.javaeye.com/topic/208981