乐趣区

关于memcached:网络协议之memcached-binary-protocol详解

简介

后面讲到了 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/

最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不

欢送关注我的公众号:「程序那些事」, 懂技术,更懂你!

退出移动版