`
hqman
  • 浏览: 363067 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Memcache协议中文版

阅读更多


写在前头
偶然之间看到本文的中英文对照版本,感觉看起来不是很方便,于是花费了半个小时的时间,仔细整理出了独立的中文版本,并记录下来。

协议
memcached 的客户端使用TCP链接 与 服务器通讯。(UDP接口也同样有效,参考后文的 “UDP协议” )一个运行中的memcached服务器监视一些(可设置)端口。客户端连接这些端口,发送命令到服务器,读取回应,最后关闭连接。

结束会话不需要发送任何命令。当不再需memcached服务时,要客户端可以在任何时候关闭连接。需要注意的是,鼓励客户端缓存这些连接,而不是 每次需要存取数据时都重新打开连接。这是因为memcached 被特意设计成及时开启很多连接也能够高效的工作(数百个,上千个如果需要的话)。缓存这些连接,可以消除建立连接所带来的开销(/*/相对而言,在服务器 端建立一个新连接的准备工作所带来的开销,可以忽略不计。)。

 

在memcache协议中发送的数据分两种:文本行 和 自由数据。 文本行被用于来自客户端的命令和服务器的回应。自由数据用于客户端从服务器端存取数据时。同样服务器会以字节流的方式传回自由数据。/*/服务器不用关心 自由数据的字节顺序。自由数据的特征没有任何限制;但是通过前文提到的文本行,这项数据的接受者(服务器或客户端),便能够精确地获知所发送的数据库的长 度。

文本行固定以“\r\n”(回车符紧跟一个换行符)结束。 自由数据也是同样会以“\r\n”结束,但是 \r(回车符)、\n(换行符),以及任何其他8位字符,均可出现在数据中。因此,当客户端从服务器取回数据时,必须使用数据区块的长度来确定数据区块的 结束位置,而不要依据数据区块末尾的“\r\n”,即使它们固定存在于此。

键值
存储在memcached中的数据通过键值来标识。键值是一个文本字符串,对于需要存取这项数据的客户端而言,它必须是唯一的。键值当前的长度限制设定为250字符(当然,客户端通常不会用到这么长的键);键值中不能使用制表符和其他空白字符(例如空格,换行等)。

命令
所有命令分为3种类型:
存储命令(有3项:’set’、’add’、’repalce’)指示服务器储存一些由键值标识的数据。客户端发送一行命令,后面跟着数据区块;然后,客户端等待接收服务器回传的命令行,指示成功与否。
取回命令(只有一项:’get’)指示服务器返回与所给键值相符合的数据(一个请求中右一个或多个键值)。客户端发送一行命令,包括所有请求的键值;服务 器每找到一项内容,都会发送回客户端一行关于这项内容的信息,紧跟着是对应的数据区块;直到服务器以一行“END”回应命令结束。
/*?*/其他的命令都不能携带自由数据。在这些命令中,客户端发送一行命令,然后等待(由命令所决定)一行回应,或最终以一行“END”结束的多行命令。

一行命令固定以命令名称开始,接着是以空格隔开的参数(如果有参数的话)。命令名称大小写敏感,并且必须小写。一些客户端发送给服务器的命令会包含 一些时限(针对内容或客户端请求的操作)。这时,时限的具体内容既可以是Unix时间戳(从1970年1月1日开始的秒钟数),或当前时间开始的秒钟数。 对后者而言,不能超过 60*60*24*30(30天);如果超出,服务器将会理解为Unix时间戳,而不是从当前时间起的秒偏移。

错误字串
每一个由客户端发送的命令,都可能收到来自服务器的错误字串回复。这些错误字串会以三种形式出现:
- “ERROR\r\n”
意味着客户端发送了不存在的命令名称。
- “CLIENT_ERROR <error>\r\n”
意味着输入的命令行里存在一些客户端错误,例如输入未遵循协议。<error>部分是人类易于理解的错误解说……
- “SERVER_ERROR <error>\r\n”
意味着一些服务器错误,导致命令无法执行。<error>部分是人类易于理解的错误解说。在一些严重的情形下(通常应该不会遇到),服务器将在发送这行错误后关闭连接。这是服务器主动关闭连接的唯一情况。
在后面每项命令的描述中,这些错误行不会再特别提到,但是客户端必须考虑到这些它们存在的可能性。

存储命令
首先,客户端会发送一行像这样的命令:
<command name> <key> <flags> <exptime> <bytes>\r\n
- <command name> 是 set, add, 或者 repalce

  • set 意思是 “储存此数据”
  • add 意思是 “储存此数据,只在服务器*未*保留此键值的数据时”
  • replace意思是 “储存此数据,只在服务器*曾*保留此键值的数据时”

- <key> 是接下来的客户端所要求储存的数据的键值
- <flags> 是在取回内容时,与数据和发送块一同保存服务器上的任意16位无符号整形(用十进制来书写)。客户端可以用它作为“位域”来存储一些特定的信息;它对服务器是不透明的。
- <exptime> 是终止时间。如果为0,该项永不过期(虽然它可能被删除,以便为其他缓存项目腾出位置)。如果非0(Unix时间戳或当前时刻的秒偏移),到达终止时间后,客户端无法再获得这项内容。
- <bytes> 是随后的数据区块的字节长度,不包括用于分野的“\r\n”。它可以是0(这时后面跟随一个空的数据区块)。

在这一行以后,客户端发送数据区块。
<data block>\r\n
- <data block> 是大段的8位数据,其长度由前面的命令行中的<bytes>指定。

发送命令行和数据区块以后,客户端等待回复,可能的回复如下:
- “STORED\r\n”
表明成功.
- “NOT_STORED\r\n”
表明数据没有被存储,但不是因为发生错误。这通常意味着add 或 replace命令的条件不成立,或者,项目已经位列删除队列(参考后文的“delete”命令)。

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

如果在取回请求中发送了一些键名,而服务器没有送回项目列表,这意味着服务器没这些键名(可能因为它们从未被存储,或者为给其他内容腾出空间而被删除,或者到期,或者被已客户端删除)。

删除
命令“delete”允许从外部删除内容:
delete <key> <time>\r\n
- <key> 是客户端希望服务器删除的内容的键名
- <time> 是一个单位为秒的时间(或代表直到某一刻的Unix时间),在该时间内服务器会拒绝对于此键名的“add”和“replace”命令。此时内容被放入 delete队列,无法再通过“get”得到该内容,也无法是用“add”和“replace”命令(但是“set”命令可用)。直到指定时间,这些内容 被最终从服务器的内存中彻底清除。
<time>参数 是可选的,缺省为0(表示内容会立刻清除,并且随后的存储命令均可用)。
此命令有一行回应:
- “DELETED\r\n”
表示执行成功
- “NOT_FOUND\r\n”
表示没有找到这项内容

参考随后的“flush_all”命令使所有内容无效

增加/减少
命令 “incr” 和 “decr”被用来修改数据,当一些内容需要 替换、增加 或减少时。这些数据必须是十进制的32位无符号整新。如果不是,则当作0来处理。修改的内容必须存在,当使用“incr”/“decr”命令修改不存在的 内容时,不会被当作0处理,而是操作失败。

客户端发送命令行:
incr <key> <value>\r\n

decr <key> <value>\r\n
- <key> 是客户端希望修改的内容的建名
- <value> 是客户端要增加/减少的总数。

回复为以下集中情形:
- “NOT_FOUND\r\n”
指示该项内容的值,不存在。
- <value>\r\n ,<value>是 增加/减少 。
注意”decr”命令发生下溢:如果客户端尝试减少的结果小于0时,结果会是0。”incr” 命令不会发生溢出。

状态
命令”stats” 被用于查询服务器的运行状态和其他内部数据。有两种格式。不带参数的:
stats\r\n
这会在随后输出各项状态、设定值和文档。另一种格式带有一些参数:
stats <args>\r\n
通过<args>,服务器传回各种内部数据。因为随时可能发生变动,本文不提供参数的种类及其传回数据。

各种状态
受到无参数的”stats”命令后,服务器发送多行内容,如下:
STAT <name> <value>\r\n
服务器用以下一行来终止这个清单:
END\r\n
在每行状态中,<name> 是状态的名字,<value> 使状态的数据。 以下清单,是所有的状态名称,数据类型,和数据代表的含义。
在“类型”一列中,”32u”表示32位无符号整型,”64u”表示64位无符号整型,”32u:32u”表示用冒号隔开的两个32位无符号整型。

名称 类型 含义
pid 32u 服务器进程ID
uptime 32u 服务器运行时间,单位秒
time 32u 服务器当前的UNIX时间
version string 服务器的版本号
rusage_user 32u:32u 该进程累计的用户时间
(秒:微妙)
rusage_system 32u:32u 该进程累计的系统时间
(秒:微妙)
curr_items 32u 服务器当前存储的内容数量
total_items 32u 服务器启动以来存储过的内容总数
bytes 64u 服务器当前存储内容所占用的字节数
curr_connections 32u 连接数量
total_connections 32u 服务器运行以来接受的连接总数
connection_structures 32u 服务器分配的连接结构的数量
cmd_get 32u 取回请求总数
cmd_set 32u 存储请求总数
get_hits 32u 请求成功的总次数
get_misses 32u 请求失败的总次数
bytes_read 64u 服务器从网络读取到的总字节数
bytes_written 64u 服务器向网络发送的总字节数
limit_maxbytes 32u 服务器在存储时被允许使用的字节总数

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

结束的话
原文最早的出处可能是在http://www.alee2002.com/1这里,然后博乐转载了,再然后我在车东的blog看到了。如果你对Memcache有更多的兴趣,可以参考下列文章:
Linux下的Memcache安装 :http://www.ccvita.com/257.html
Windows下的Memcache安装 :http://www.ccvita.com/258.html
Memcache基础教程 :http://www.ccvita.com/259.html
Discuz!的Memcache缓存实现 :http://www.ccvita.com/261.html
Memcache协议中文版 :http://www.ccvita.com/306.html

分享到:
评论

相关推荐

    Windows下的Memcache安装.doc

    - [Memcache协议中文版](http://www.ccvita.com/306.html) - [Memcache分布式部署方案](http://www.ccvita.com/395.html) 以上步骤和信息旨在帮助开发者顺利地在Windows环境中安装和配置Memcache,以便于后续的应用...

    memcache1.2.1 for windows

    - 底层协议简单:使用基于文本的简单协议,易于实现客户端和服务器之间的通信。 3. **Memcache与PHP的结合** PHP是Web开发中常用的语言,通过PHP的Memcache扩展,可以方便地在PHP应用中使用Memcache。`...

    各种版本 PHP memcache_dll .zip

    需要注意的是,PHP Memcache扩展不支持Memcached的一些高级特性,如持久连接和二进制协议。如果你需要这些特性,可以考虑使用更新的PHP Memcached扩展,它基于libmemcached库,提供了更全面的功能支持。 在使用...

    PHP7.x 8.0 memcache dll php_memcache.dll

    6. **替代方案**:随着PHP的发展,`Memcached`扩展(注意字母d的区别)逐渐成为更推荐的选择,因为它支持更多的协议特性,且在多线程和新版本PHP上的兼容性更好。 7. **安全性**:使用memcache时要注意数据安全性,...

    PHP7.1.xx-7.3xx各版本适配memcache.dll

    `memcache` 是用于与原始Memcached服务交互的PHP扩展,而 `memcached` 是另一个扩展,通常用于与升级版的Memcached服务器通信,它支持更多的协议特性。 在PHP 7.x中,由于官方停止了对 `memcache` 扩展的支持,很多...

    windows本地开启memcache服务

    - 为了确保Memcache服务已正确启动,你可以使用telnet客户端或者一个支持Memcache协议的工具(如PHP的`memcache`扩展或Python的`pylibmc`库)连接到本地的11211端口。如果能成功连接,说明服务工作正常。 5. **...

    Memcache需要的依赖包

    5. **轻量级协议**:Memcache使用简单的文本协议与客户端通信,易于实现,同时减少了网络传输的开销。 6. **跨语言支持**:Memcache提供了多种编程语言的客户端库,包括PHP、Python、Java、Ruby、C++等,使得各种...

    memcache-2.2.6.tgz

    5. **TCP/IP 协议**:使用简单的文本协议,易于实现和调试,同时也支持多语言客户端库。 6. **扩展性**:可以通过增加更多服务器节点轻松扩展存储容量。 在"memcache-2.2.6.tgz"压缩包中,"package.xml"可能是一个...

    memcache-3.0.6.tgz

    - **高效性**:Memcache 扩展支持二进制协议,数据传输更高效。 - **简单易用**:PHP API 直观且易于理解,使得开发人员能够快速集成和使用。 - **分布式支持**:可以连接多个 Memcached 服务器,实现数据的分布式...

    MemCache Client端类库

    2. **命令发送与接收**:实现MemCache协议,如`GET`、`SET`、`ADD`、`DELETE`等命令的编码和解码,以及正确处理响应。 3. **数据序列化与反序列化**:由于MemCache仅支持二进制数据,客户端需要负责将C++对象序列...

    memcache监控工具

    - **Zabbix**:一个强大的企业级监控解决方案,支持多种监控协议,可以全面监控Memcache。 - **Ganglia**:适合大规模分布式集群的监控,提供实时的性能数据聚合。 4. **监控指标** - **命中率**:衡量缓存效率...

    MemCache服务器端和使用说明

    5. **多协议支持**:MemCache支持多种网络协议,如TCP和UDP,以及文本协议和二进制协议。 **二、安装MemCache服务器端** 1. **下载**:在本压缩包中,包含了最新版的Win32 Memcache服务器端——`memcached-win32-...

    阿里云-云数据库Memcache-快速入门.pdf

    云数据库Memcache版快速入门主要介绍了阿里云提供的基于Memcached协议的分布式内存缓存服务,旨在提升应用程序的数据访问速度和性能。以下是对该服务关键知识点的详细说明: 1. **协议支持**: - **Memcached ...

    MemCache对象缓存应用

    “源码”标签可能意味着本文将深入探讨MemCache的内部机制,包括其数据结构、缓存淘汰策略(如LRU,Least Recently Used)、网络通信协议等方面。理解这些有助于开发者优化使用或者为社区贡献代码。 **六、使用工具...

    Memcache完全剖析 最实用的Memcache文档

    Memcached的最新发展方向包括二进制协议的采用,相比传统文本协议,二进制协议能更有效地减少网络传输的数据量,并提供更强的功能性。外部引擎的支持也是其发展方向之一,这样Memcached就可以支持更多种类的数据存储...

    php_memcache-3.0.8-5.6-nts-vc11-x86

    Memcache 扩展通过 TCP 或 UDP 协议连接到 Memcached 服务器,它提供了一系列的函数,如 `memcache_connect()`、`memcache_pconnect()`、`memcache_set()`、`memcache_get()` 和 `memcache_delete()` 等,用于存取...

    阿里云 专有云Enterprise版 云数据库Memcache版 V3.3.0 用户指南 20180312.pdf

    云数据库Memcache版是阿里云提供的一种基于Memcache协议的高性能NoSQL数据库,旨在满足大规模数据存储和高性能数据访问的需求。该数据库支持高性能的数据读写、自动故障恢复、自动扩展等功能,广泛应用于大规模数据...

Global site tag (gtag.js) - Google Analytics