简介
后面讲到了memcached的文本协定,尽管文本协定看起来非常简单,然而对于客户端来说个别还是会抉择效率更高的二进制协定。
二进制协定的实质和文本协定是一样的,只是他们的体现形式不同而已。本文将会具体介绍memcached中二进制协定的实现细节。
memcached的协定包
对于memcached的申请包和响应包来说,除了申请头有所区别之外,其余的格局都是一样的。
所以对memcached的申请和响应都能够用同一个包的格局来示意:
后面的24个byte是包头局部,接下来的是命令行的额定数据extra,memcached中的key和value。
下面也提到了,申请包和响应包的区别就是header,上面是申请包头和响应包头的定义:
申请包头:
响应包头:
包头中各个字段的含意如下:
- Magic: 魔法数字,用来辨别包头是申请包头还是响应包头
如果是申请,那么对应的Magic= 0x80,如果是响应,那么对应的Magic= 0x81。
在最后的设计中,Magic应该和协定的版本绝对应的,当版本升级之后,对应的Magic也要进行相应的调整。然而到目前为止,binary协定的magic值还没有变动过。
- Opcode: 操作符,也就是对应的命令
memcached协定中有上面这些操作符:
其中带星号的示意该命令未定,将来可能会有批改。
以Q结尾的命令,示意这个命令是一个quiet的版本,它会疏忽不感兴趣的返回数据。
- Key length: key的长度
- Status: 申请响应response的状态
response的值有上面几种:
- Extras length: command extras的长度
- Data type:保留字段
data type是一个保留字段,目前只有一个固定的值:0x00。
- vbucket id: 命令对应的virtual bucket
- Total body length:extra + key + value的总长度
- Opaque: 申请生成的一个数据,会被一成不变在对应的响应中返回
- CAS:数据的一个惟一标记
memcached命令举例
为了更好的了解memcached的二进制协定,咱们以几个罕用的命令为例,来看一下memcached具体的申请和响应流程。
最罕用的就是get申请,用于向服务器端请某个key对应的值。
如果当初客户端要向服务器端get一个key=hello的数据,那么申请的包如下所示:
其中Magic=0x80, Opcode=0x00,Key length=0x0005,Total body=0x00000005,Key="Hello"
如果服务器端存在对应的key的值,那么将会返回如下的数据包:
咱们要留神上面几个跟request值不同的字段:
其中Magic=0x81示意这个是一个response, 因为这是一个response,所以对应的Key length=0x0000。
另外response中蕴含了get申请中并不存在的Extra length和Extras Flags,这里他们的值别离是0x04和0xdeadbeef,示意Extra length是4个bytes,它的值是0xdeadbeef。
那么这个Extras Flags值是哪里来的呢?如果比照之前讲到的text协定,就能够晓得,Extras Flags是在set key value的时候传入的,这个Flags会寄存到服务器端,并在get申请中返回。
最初,response中蕴含了要返回的值"World"。
如果服务器端并没有这个key的值,那么对应的返回包可能是这样的:
其中Status=0x0001,示意是一个异样返回。
对应的value是:"Not found"。
之前还提到了一个以Q结尾的命令行版本,比方getQ,它和get的区别是getQ会把申请的key也放在response包中返回:
因为最初的值中蕴含了key,所以这里的Key length是有值的,他就是key的长度=0x0005。
最初的返回数据局部蕴含了两局部,别离是Key="Hello",value="World"。
总结
以上咱们介绍了memcached二进制协定的根本格局,并举例说明了get申请的具体应用和包的内容。有了这些常识,咱们就能够开发一个反对memcached二净值协定的客户端了。
更多内容请参考 http://www.flydean.com/24-memcached-binary-protocol/
最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不
欢送关注我的公众号:「程序那些事」,懂技术,更懂你!