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
3)"SERVER_ERROR
在下面单独的命令里,这些错误不会再提及,但是客户端必须允许这种出错的可能。