概述
在memcached协议中有两种类型的数据:文本行,非结构化数据。文本行用于从客户端发送命令或者从服务器端返回应答。非机构化数据是客户端想要存储或获取的数据。对于非结构化的数据,对于字符长度没有限制。但是这些数据的读取者(不管是服务器还是客户端)都需要知道数据块的长度(通过之前文本行传递该信息)。
文本行和非结构化数据均以\r\n为结束标记。数据块中可以记录\r、\n以及其他的8位字符,为了与结束标记区别,必须使用文本行中的数据块长度信息。
Key的长度限制在250个字符,并且key中不能包含控制字符或空格。
Memcached中共有三类命令:
1、存储命令:set、add、replace、append、prepend、cas。客户端发送一个命令行,然后是数据块;命令处理后,客户端会收到应答行,指定处理成功还是失败。
2、获取命令:get、gets。客户端发送一个命令行,其中包括所有的请求key。服务器处理后,对于每一个key,服务器返回客户端一个关于元素信息的应答,以及元素值的数据块;处理完后,服务器会返回一个“END”应答行。
3、其他命令:不涉及非结构化数据。客户端发送一个命令行,收到一个应答行或者多个应答行,最后以“END”行结束。
注意:一个命令行以命令名开始,后面跟着一些以空格分隔的参数。命令名是小写字符,并且是大小写敏感的。
过期时间
过期时间要么是Unix时间(从1970-1-1开始计算的秒数),要么是从当前时间开始计算的秒数。该值不能超过30天,否则服务器将该参数当做真正的Unix时间而不是当前时间的一个偏移值。
错误字符串
任何一个客户端发送的命令都有可能从服务器端收到一个错误字符串的应答。这些错误字符串有三种类型:
1、”ERROR\r\n”
说明客户端发送了一个不存在的命令。
2、”CLINET_ERROR<error>\r\n”
说明在输入行中存在某种类型的客户端错误,例如输入的信息没有遵守memcached的协议。<error>是具有可读性的错误字符串。
3、”SERVER_ERROR<error>\r\n”
说明服务器端存在某种类型的错误导致命令无法执行。<error>是具有可读性的错误字符串。当服务器端错误发生后,将会导致服务器将不会再提供服务,服务器在发送该错误信息行后将关闭连接。只有在此场景下,服务器端才会关闭与客户端的连接。
存储命令
首先客户端发送一个命令行,格式如下:
<command name> <key> <flags> <exptime><bytes> [noreply]\r\n
cas <key> <flags> <exptime> <bytes><cas unique> [noreply]\r\n
1、<commandname>可以是”set”,”add”,”replace”,”append”或者”prepend”。
“set”:存储数据。
“add”:仅当在服务器端没有存放该key时才会存储数据。
“replace”:仅当在服务器端已经存放该key时才会存储数据。
“append”:将数据添加到存在的key对应数据的后面。
“prepend”:将数据添加到存在的key对应数据的前面。
“append”和”prepend”命令仅更新已经存在数据,不会更新flag及过期时间设置。
“cas”是一个检查并设置操作,只有在获取该数据后,没有人对该数据进行修改时才存储该数据。
2、<key>客户端将数据存放在该键下。
3、<flags>16位的无符号整数值。服务器将该值与数据一块存储,而且在获取数据时,该值也一并返回。客户端可用该值作为位字段存放数据指定的信息。
4、<exptime>元素超时时间。如果为0,说明永不超时。
5、<bytes>紧跟着的数据块字节大小,不包括分隔符\r\n,但包括数据块中的\r、\n字符。可以为0,说明后面跟着空数据块。
6、<casunique>存在元素的唯一64位值。客户端通过”gets”命令可获得该值,并在”cas”更新时使用该值。
7、”noreply”可选参数。通知服务器端可不用发送应答。
在命令行后,客户端发送数据块:
<data block>\r\n
1、<datablock>是一系列8位长度数据,大小为命令行中通过<bytes>指定的。
在发送命令行以及数据块后,客户端等待应答,有以下几种:
1、”STORED\r\n”,说明成功。
2、”NOT_STORED\r\n”,说明数据没有被存储,但不是因为错误。通常是因为”add”或”replace”命令没有被满足。
3、”EXISTS\r\n”,说明”cas”存放的数据已经被修改过了。
4、”NOT_FOUND\r\n”,说明”cas”命令存放的元素不存在。
取值命令
get <key>*\r\n
gets <key>*\r\n
1、<key>*:一个或多个由空格分隔的key字符串。
当所有的元素发送完毕后,服务器端发送”END\r\n”说明应答结束。
每个被服务器发送的元素类似下面的形式:
VALUE <key> <flags> <bytes> [<casunique>]\r\n
<data block>\r\n
1、<key>:被发送元素的key。
2、<flags>:被存储命令设置的标记值。
3、<bytes>:数据块的长度,不含分隔符\r\n。
4、<casunique>:唯一标示指定元素的64位整数。
5、<datablock>:此元素的数据。
其他命令
删除
命令”delete”用来删除指定元素:
delete <key> [noreply]\r\n
1、<key>:指定需要服务器删除元素的key。
2、”noreply”:可选参数。通知服务器不用发送应答消息。
这个命令应答行可能是:
1、”DELETED\r\n”:删除成功。
2、”NOT_FOUND\r\n”:key对应的元素没有找到。
增值/减值
命令”incr”和”decr”用于更新指定元素的值,用于增加或减少值。该命令只能对存在的元素进行处理,对于不存在元素将会失败。
客户端发送的命令行:
incr <key> <value> [noreply]\r\n
或
decr <key> <value> [noreply]\r\n
1、<key>:客户端希望改变元素的key。
2、<value>:需要增加/减少元素的值。
3、”noreply”:可选参数。通知服务器不用发送应答消息。
服务器应答可能是:
1、”NOT_FOUND\r\n”:说明指定元素没有找到。
2、<value>\r\n:在增加/减少操作执行后,对应元素更新后的值。
Touch
“touch”命令用于更新元素的失效时间。
命令行格式:
touch <key> <exptime> [noreply]\r\n
1、”key”:更新失效时间的元素的key。
2、<exptime>:失效时间。工作机制与set/add命令类似。
3、”noreply”:可选参数。通知服务器不用发送应答消息。
此命令的应答行可能是:
1、”TOUCHED\r\n”:成功。
2、”NOT_FOUND\r\n”:指定key不存在。
Flush all
命令行格式:
flush_all [delay] [noreply]\r\n
应答行是”OK\r\n”,若发起命令时指定了noreply参数,则不会有应答消息。
“flush_all”命令将会立即或者在指定的失效时间后失效所有的元素。”flush_all”实际上不会主动清除已存在元素的内存空间。
当有多个memcached服务,并且你想失效这些服务器上所有的内容,你可以不用同时设置所有的memcached服务,如果同时失效所有内容,可能会对数据库产生致命危机。“flush_all”指定延迟时间的目的就在于此。
Version
“version”是一个没有参数的命令。
命令行格式:
version\r\n
应答行:
VERSION <version>\r\n
<version>是memcached服务的版本字符串。
Verbosity
verbosity <level> [noreply]\r\n
“verbosity”命令的作用是设置日志输出的级别。<level>是数值,代表级别信息。
应答行是”OK\r\n”。若发起命令时指定了noreply参数,则不会有应答消息。
Quit
“quit”是一个没有参数的命令。
命令行格式:
quit\r\n
当收到此命令后,服务器将关闭连接。客户端当不再使用连接时,不用发起该命令也可以简单关闭该连接。