Memcache协议的学习
TCP协议
memcached 的客户端使用TCP连接与服务器通讯。一个运行中的memcached服务器监视一些端口。客户端连接这些端口,发送命令到服务器,读取回应,最后关闭连接。
结束会话不需要发送任何命令。当不再需memcached服务时,要客户端可以在任何时候关闭连接。需要注意的是,鼓励客户端缓存这些连接,而不是每次需要存取数据时都重新打开连接。这是因为memcached 被特意设计成及时开启很多连接也能够高效的工作。缓存这些连接,可以消除建立连接所带来的开销。
在memcache协议中发送的数据分两种:文本行和自由数据。 文本行被用于来自客户端的命令和服务器的回应。自由数据用于客户端从服务器端存取数据时。同样服务器会以字节流的方式传回自由数据。服务器不用关心自由数据的字节顺序。自由数据的特征没有任何限制;但是通过前文提到的文本行,这项数据的接受者(服务器或客户端),便能够精确地获知所发送的数据库的长度。
文本行固定以“\r\n”(回车符紧跟一个换行符)结束。 自由数据也是同样会以“\r\n”结束,但是 \r(回车符)、\n(换行符),以及任何其他8位字符,均可出现在数据中。因此,当客户端从服务器取回数据时,必须使用数据区块的长度来确定数据区块的结束位置,而不要依据数据区块末尾的“\r\n”,即使它们固定存在于此。
键值
存储在memcached中的数据通过键值来标识。键值是一个文本字符串,对于需要存取这项数据的客户端而言,它必须是唯一的。键值当前的长度限制设定为250字符;键值中不能使用制表符和其他空白字符(例如空格,换行等)。
命令
所有命令分为3种类型:
一行命令固定以命令名称开始,接着是以空格隔开的参数(如果有参数的话)。命令名称大小写敏感,并且必须小写。一些客户端发送给服务器的命令会包含一些时限(针对内容或客户端请求的操作)。这时,时限的具体内容既可以是Unix时间戳(从1970年1月1日开始的秒钟数),或当前时间开始的秒钟数。对后者而言,不能超过 60*60*24*30(30天);如果超出,服务器将会理解为Unix时间戳,而不是从当前时间起的秒偏移。
错误字串
每一个由客户端发送的命令,都可能收到来自服务器的错误字串回复。这些错误字串会以三种形式出现:
在后面每项命令的描述中,这些错误行不会再特别提到,但是客户端必须考虑到这些它们存在的可能性。
存储命令
首先,客户端会发送一行像这样的命令:
-
-
-
-
-
\r\n
- 是大段的8位数据,其长度由前面的命令行中的
发送命令行和数据区块以后,客户端等待回复,可能的回复如下:
- “STORED\r\n” 表明成功.
- “NOT_STORED\r\n“表明数据没有被存储,但不是因为发生错误。这通常意味着add 或 replace命令的条件不成立,或者,项目已经位列删除队列(参考后文的“delete”命令)。
取回命令
一行取回命令如下:
get
-
这行命令以后,客户端的等待0个或多个项目,每项都会收到一行文本,然后跟着数据区块。所有项目传送完毕后,服务器发送以下字串:
“END\r\n“
来指示回应完毕。
服务器用以下形式发送每项内容:
VALUE
\r\n
-
-
-
- 是发送的数据
如果在取回请求中发送了一些键名,而服务器没有送回项目列表,这意味着服务器没这些键名(可能因为它们从未被存储,或者为给其他内容腾出空间而被删除,或者到期,或者被已客户端删除)。
删除
命令“delete”允许从外部删除内容:
delete
-
-
此命令有一行回应:
- “DELETED\r\n” 表示执行成功
- “NOT_FOUND\r\n” 表示没有找到这项内容
参考随后的“flush_all”命令使所有内容无效
增加/减少
命令 “incr” 和 “decr”被用来修改数据,当一些内容需要 替换、增加 或减少时。这些数据必须是十进制的32位无符号整新。如果不是,则当作0来处理。修改的内容必须存在,当使用“incr”/“decr”命令修改不存在的内容时,不会被当作0处理,而是操作失败。
客户端发送命令行:incr
-
-
回复为以下集中情形:
- “NOT_FOUND\r\n” 指示该项内容的值,不存在。
-
状态
命令”stats” 被用于查询服务器的运行状态和其他内部数据。有两种格式。不带参数的:stats\r\n。这会在随后输出各项状态、设定值和文档。另一种格式带有一些参数:stats
各种状态
受到无参数的”stats”命令后,服务器发送多行内容,如下:STAT
。在每行状态中,
在“类型”一列中,”32u”表示32位无符号整型,”64u”表示64位无符号整型,”32u:32u”表示用冒号隔开的两个32位无符号整型。
其它命令
“flush_all”命令有一个可选的数字参数。它总是执行成功,服务器会发送“OK\r\n”回应。它的效果是使已经存在的项目立即失效(缺省),或在指定的时间后。此后执行取回命令,将不会有任何内容返回(除非重新存储同样的键名)。flush_all 实际上没有立即释放项目所占用的内存,而是在随后陆续有新的项目被储存时执行。flush_all 效果具体如下:它导致所有更新时间早于flush_all所设定时间的项目,在被执行取回命令时命令被忽略。
“version”命令没有参数:version\r\n。在回应中,服务器发送:”VERSION
接收此命令后,服务器关闭连接。不过,客户端可以在不再需要时,简单地关闭连接就行,并不一定需要发送这个命令。
UDP 协议
当来自客户端的连接数远大于TCP连接的上限时,可以使用基于UDP的接口。UDP接口不能保证传输到位,所以只有在不要求成功的操作中使用;比如被用于一个“get”请求时,会因不当的缓存处理而发生错误或回应有遗失。
每个UDP数据包都包含一个简单的帧头,数据之后的内容与TCP协议的描述类似。在执行所产生的数据流中,请求必须被包含在单独的一个UDP数据包中,但是回应可能跨越多个数据包。(只有“get”和“set”请求例外,跨越了多个数据包)
帧头有8字节长,如下(均由16位整数组成,网络字节顺序,高位在前):
请求ID有客户端提供。一般它会是一个从随机基数开始的递增值,不过客户端想用什么样的请求ID都可以。服务器的回应会包含一个和请求中的同样的ID。客户端使用请求ID来区分每一个回应。任何一个没有请求ID的数据包,可能是之前的请求遭到延迟而造成的,应该被丢弃。序号的返回是从0到n-1,n是该条信息的数据包数量。
参考链接:http://www.ccvita.com/306.html
建议继续学习:
- 关于memcache分布式一致性hash (阅读:10685)
- Memcache分布式部署方案 (阅读:5429)
- 关于session和memcache的若干问题 (阅读:4273)
- Memcache源代码分析之数据存储 (阅读:3884)
- Memcache mutex设计模式 (阅读:3748)
- 关于Memcache长连接自动重连的问题 (阅读:3666)
- Memcache源代码分析之网络处理 (阅读:3591)
- memcache的几点注意 (阅读:3467)
- 解决memcache连接奇慢问题一例 (阅读:3458)
- memcache连接慢又一例 (阅读:3299)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:标点符 来源: 标点符
- 标签: Memcache
- 发布时间:2012-03-19 23:43:04
- [70] Go Reflect 性能
- [68] 如何拿下简短的域名
- [65] Oracle MTS模式下 进程地址与会话信
- [63] 图书馆的世界纪录
- [62] IOS安全–浅谈关于IOS加固的几种方法
- [61] 【社会化设计】自我(self)部分――欢迎区
- [59] android 开发入门
- [54] 视觉调整-设计师 vs. 逻辑
- [49] 界面设计速成
- [48] 读书笔记-壹百度:百度十年千倍的29条法则