Memcache协议

我们的debian服务器上直接用apt-get install的memcached版本是1.2.2。cas的命令支持是从版本1.4.0开始的。

查看memcached 1.2.2的协议,参考译文

查看memcached最新版本的协议

以1.2.2版本的协议为例:

  • 数据分为两种,命令行数据和自由数据。命令行数据以\r\n结尾,自由数据也以\r\n结尾,但由于自由数据中会允许包含\r,\n这种字符,所以在获取自由数据时,应以自由数据的length为标准。(这点和html协议有点类似)
  • key是一个字符串,长度不能超过250个,键值中不能使用制表符和其他空白字符(例如空格,换行等)。
  • 存储命令有set,add,replace。获取命令有get
  • 设置value的时限时,可以为unix时间戳(1970年1月1日开始的秒数),也可以是从当前时间开始的秒数。如果为第二种情况时,设置的秒数不能超过60*60*24*30(30天),否则会被认为是第一种情况
  • 存储命令格式:<command name> <key> <flags> <exptime> <bytes>\r\n。- <exptime> 是终止时间。如果为0,该项永不过期(虽然它可能被删除,以便为其他缓存项目腾出位置)。如果非0(Unix时间戳或当前时刻的秒偏移),到达终止时间后,客户端无法再获得这项内容。
  • 取回命令:get <key>*\r\n。- <key>* 表示一个或多个键值,由空格隔开的字串。服务器用以下形式发送每项内容: VALUE <key> <flags> <bytes>\r\n <data block>\r\n
  • 命令 “incr” 和 “decr”被用来修改数据,当一些内容需要 替换、增加 或减少时。这些数据必须是十进制的32位无符号整新。如果不是,则当作0来处理。修改的内容必须存在,当使用“incr”/“decr”命令修改不存在的内容时,不会被当作0处理,而是操作失败。(注意”decr”命令发生下溢:如果客户端尝试减少的结果小于0时,结果会是0。”incr” 命令不会发生溢出。)
  • flush_all 实际上没有立即释放项目所占用的内存,而是在随后陆续有新的项目被储存时执行。flush_all 效果具体如下:它导致所有更新时间早于flush_all所设定时间的项目,在被执行取回命令时命令被忽略。

1.4.0后协议改动:

  • 存储命令增加了append, prepend 和 cas; 获取命令增加了gets
  • 命令格式:<command name> <key> <flags> <exptime> <bytes> [noreply]\r\n 和 cas <key> <flags> <exptime> <bytes> <cas unique> [noreply]\r\n, <command name> is “set”, “add”, “replace”, “append” or “prepend”;
  • append是在已有的数据后追加数据,prepend是在已有的数据前加数据。append和prepend都不接受flag和exptime的参数。
  • “cas” is a check and set operation which means “store this data but only if no one else has updated since I last fetched it.”
  • <cas unique> is a unique 64-bit value of an existing entry. Clients should use the value returned from the “gets” command when issuing “cas” updates.
  • “noreply” optional parameter instructs the server to not send the reply.
  • incr和decr的命令要求数据为10进制64位整型。如果不是该类型,操作就会返回错误。

附:使用python执行memcache cas的例子

– EOF –

4 comments:

Leave a Reply

Your email address will not be published. Required fields are marked *