memcache通信协议(一)

来源:互联网 发布:淘宝全民抢购 编辑:程序博客网 时间:2024/05/16 01:35

memcache的客户端和服务器端的通信通过TCP连接(UDP也是可以的,具体内容在UDP协议里),memcache服务器端监听一些可配置的端口,客户端连接到这个端口,向服务器端发送命令,读取响应,关闭连接。

没必要发送命令去关闭这个会话。客户端只有在完全不需要它的时候才会关闭它。注意,客户端鼓励缓存连接,而不是每次存取数据都重新打开。这是因为memcache被设计成在打开大量连接(有时是成百上千的)时依然很高效,把连接缓存起来,有助于避免重新建立TCP连接造成的性能损失,和客户端相比,在服务器端准备这样的连接是无关紧要的。


在MC协议里,有两种数据会被传输。文本行和非结构话数据,文本行被客户端用来发送命令,服务器端用来发送响应。当客户端存储或检索数据时非结构话数据被传输,服务器端会以相同的方式把它收到的数据以byte流的形势发送回客户端。服务器端不知道也不关心字节顺序问题。对于在非结构话数据中的字符没有任何限制,然后,对于数据的读取者(客户端或者服务器)通过前面的文本行一定会知道被传输的文本块的长度。


文本行总是以为\r\n结尾,非结构话数据也是以\r\n结尾,即使\r ,\n或者其它8bit字符也可能出在数据中。然而,当客户端从服务器端检索数据时,必须使用数据块的长度定位数据块在哪结束,而不是通过\r\n来标志结束。


键:

存储在MC里的数据用一个键来标识,对于需要这些数据的客户端,一个数据应该用一个唯一的key进行标识,目前key的长度被限制在250个字符以内(当然,正常情况下根本不需要这么长),key也不能包含控制字符或者空格。


命令:

有三种形式的命令。

通过一个key让服务器端存储数据的命令(有六种:set   add   replace   append    prepend     cas  ),客户端发送命令行,然后发送一个字符块,之后客户端等待响应,响应会指出操作成功还是失败。

检索命令有两种('get'  'gets'),让服务器传输与一组key相关的数据。客户端发送一个命令行,里面包含了请求的所有key,对于客户端的每次请求,服务器端都会发送一个响应,里面包含请求的数据块,直到服务器端结束。

所有其它命令都不包含非结构话数据,客户端发送命令请求,也期待服务器端发回响应,或者以为“END”作为标志的结束。

命令行总是以命令名开头,然后是以为空格分隔的参数列表,命令行都是小写的,并且区分大小写。

超时时间:

客户端发送给服务端的命令会有几种超时时间,这种情况下,这个值被设置为Unix时间或者从当前时间开始的几秒,后一种情况,这个值不超过60*60*24*30(一个月的秒数),

如果客户端发送的值超过这个,服务器端会采用Unix时间而不是采用当前时间的偏移。

错误信息:

客户端发送的命令都可能从服务器端返回错误信息,主要有三种形势,

1)"ERROR\r\n" 表示客户端发送了一个不存在的命令

2)"CLIENT_ERROR <error>\r\n" 表示客户端输入的一些错误,在某些角度输入与协议不一致,<error>是可读的错误信息。

3)"SERVER_ERROR <error>\r\n" 服务器端的一些错误,阻止服务器执行命令。<error>是可读的错误信息,在服务器端出错的情况下,不可能继续给客户端提供服务,在发送错误行后,服务器端将会关闭连接。这也是唯一一种服务器端会关闭连接的情况。

在下面单独的命令里,这些错误不会再提及,但是客户端必须允许这种出错的可能。






原创粉丝点击