memcache协议(一)

取回命令一行取回命令如下:get *\r\n- * 表示一个或多个键值,由空格隔开的字串.这行命令以后,客户端的等待0个或多个项目,每项都会收到一行文本,然后跟着数据区块。所有项目传送完毕后,服务器发送以下字串:
“END\r\n”来指示回应完毕。服务器用以下形式发送每项内容:VALUE \r\n
\r\n- 是所发送的键名- 是存储命令所设置的记号

是随后数据块的长度,*不包括* 它的界定符“\r\n”- 是发送的数据如果在取回请求中发送了一些键名,而服务器没有送回项目列表,这意味着服务器没这些键名(可能因为它们从未被存储,或者为给其他内容腾出空间而被删除,或者到期,或者被已客户端删除)。删除Deletion命令“delete”允许从外部删除内容:delete

是客户端要增加/减少的总数。回复为以下集中情形:

– “NOT_FOUND\r\n”指示该项内容的值,不存在。- \r\n ,是 增加/减少 。
注意”decr”命令发生下溢:如果客户端尝试减少的结果小于0时,结果会是0。”incr” 命令不会发生溢出。状态
命令”stats” 被用于查询服务器的运行状态和其他内部数据。有两种格式。不带参数的:
stats\r\n这会在随后输出各项状态、设定值和文档。另一种格式带有一些参数:
stats \r\n通过,服务器传回各种内部数据。因为随时可能发生变动,本文不提供参数的种类及其传回数据。各种状态受到无参数的”stats”命令后,服务器发送多行内容,如下:STAT \r\n服务器用以下一行来终止这个清单:END\r\n在每行状态中, 是状态的名字, 使状态的数据。 以下清单,是所有的状态名称,数据类型,和数据代表的含义。
在“类型”一列中,”32u”表示32位无符号整型,”64u”表示64位无符号整型,”32u:32u”表示用冒号隔开的两个32位无符号整型。 名称/Name 类型/Type 含义/Meaning pid 32u 服务器进程ID Process id of this server process uptime 32u 服务器运行时间,单位秒 Number of seconds this server has been running time 32u 服务器当前的UNIX时间 current UNIX time according to the server version string 服务器的版本号 Version string of this server rusage_user 32u:32u 该进程累计的用户时间
(秒:微妙) Accumulated user time for this process 
(seconds:microseconds) rusage_system 32u:32u 该进程累计的系统时间 
(秒:微妙) Accumulated system time for this process 
(seconds:microseconds) curr_items 32u 服务器当前存储的内容数量 Current number of items stored by the server total_items 32u 服务器启动以来存储过的内容总数 Total number of items stored by this server 
ever since it started bytes 64u 服务器当前存储内容所占用的字节数 Current number of bytes used by this server 
to store items curr_connections 32u 连接数量 Number of open connections total_connections 32u 服务器运行以来接受的连接总数 Total number of connections opened since 
the server started running connection_structures 32u 服务器分配的连接结构的数量 Number of connection structures allocated 
by the server cmd_get 32u 取回请求总数 Cumulative number of retrieval requests cmd_set 32u 存储请求总数 Cumulative number of storage requests get_hits 32u 请求成功的总次数 Number of keys that have been requested and 
found present get_misses 32u 请求失败的总次数 Number of items that have been requested 
and not found bytes_read 64u 服务器从网络读取到的总字节数 Total number of bytes read by this server 
from network bytes_written 64u 服务器向网络发送的总字节数 Total number of bytes sent by this server to 
network limit_maxbytes 32u 服务器在存储时被允许使用的字节总数 Number of bytes this server is allowed to
use for storage. 其它命令

“flush_all”命令有一个可选的数字参数。它总是执行成功,服务器会发送“OK\r\n”回应。它的效果是使已经存在的项目立即失效(缺省),或在指定的时间后。此后执行取回命令,将不会有任何内容返回(除非重新存储同样的键名)。flush_all 实际上没有立即释放项目所占用的内存,而是在随后陆续有新的项目被储存时执行。flush_all 效果具体如下:它导致所有更新时间早于flush_all所设定时间的项目,在被执行取回命令时命令被忽略。

在回应中,服务器发送:”VERSION \r\n” 是服务器的版本字串。接收此命令后,服务器关闭连接。不过,客户端可以在不再需要时,简单地关闭连接就行,并不一定需要发送这个命令。UDP 协议
当来自客户端的连接数远大于TCP连接的上限时,可以使用基于UDP的接口。UDP接口不能保证传输到位,所以只有在不要求成功的操作中使用;比如被用于一个“get”请求时,会因不当的缓存处理而发生错误或回应有遗失。每个UDP数据包都包含一个简单的帧头,数据之后的内容与TCP协议的描述类似。在执行所产生的数据流中,请求必须被包含在单独的一个UDP数据包中,但是回应可能跨越多个数据包。(只有“get”和“set”请求例外,跨越了多个数据包)帧头有8字节长,如下(均由16位整数组成,网络字节顺序,高位在前):

  • 0-1 请求ID
  • 2-3 序号
  • 4-5 该信息的数据包总数
  • 6-7 保留位,必须为0

请求ID有客户端提供。一般它会是一个从随机基数开始的递增值,不过客户端想用什么样的请求ID都可以。服务器的回应会包含一个和请求中的同样的ID。客户端使用请求ID来区分每一个回应。任何一个没有请求ID的数据包,可能是之前的请求遭到延迟而造成的,应该被丢弃。序号的返回是从0到n-1,n是该条信息的数据包数量。