日期:2014-05-16  浏览次数:20389 次

Redis源码学习之【命令协议格式】

介绍

本来这篇要介绍Redis的命令解析的,但是要想对Redis的命令解析有更直观的了解,必须先了解Redis的命令协议格式。

源码

暂无(或者是是在network.c中吧)

分析

Requests

*<number of arguments> CR LF
$<number of bytes of argument 1> CR LF
<argument data> CR LF
...
$<number of bytes of argument N> CR LF
<argument data> CR LF

Redis最新支持的二进制安全的请求通用格式如上所示。具体的实例有:

*3
$3
SET
$5
mykey
$7
myvalue

转换为实际的每个字节的形式字符串为:"*3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$7\r\nmyvalue\r\n"。同时这种格式的协议也用于Redis服务器对客户端的回复中,称为Bulk reply。

这种统一请求协议在Redis也被用于向clients发送一些列的列表项,被称作为Multi Bulk Reply。它是由N的不同的Bulk Reply 加上一个 *<argc>\r\n 前缀,其中argc是Bulk Reply的个数。

Replies

Redis会向cient回复不同类型replies。根据第一字节可以决定reply回复的不同的种类:

  • Status Reply,第一字节为"+"
  • Error Reply,第一字节为"-"
  • Integer Reply,第一字节为":"
  • Bulk Reply,第一字节为"$"
  • Multi Bulk Reply,第一字节为"*"
  • Status Reply

+ <status strings> \r\n

  • Error Reply

- <error type> < error info> \r\n

  • Integer Reply

: <integer value strings> \r\n

  • Bulk Reply

$<number of bytes of the args>\r\n<args strings>\r\n

  • Multi Bulk Reply

*<number of bulk replies>\r\n<bulk reply list>\r\n

说明

在Multi-Bulk replies中如果单独的元素的长度为-1则表明该元素丢失或者是Null。

Multiple commands and pipelining

一个客户端可以使用同一个连接发送多个命令。利用管道技术可以使用一个单独的写操作将client的多个命令发送出去而不需要在发送完一个命令后等待服务器的回复。这些请求的回复可以在最后进行统一读取。

Inline Commands

Redis还支持早起的协议格式,就是在命令行中的形式如下: