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還支援早起的協議格式,就是在命令列中的形式如下:
C: PING
S: +PONG
C: EXISTS somekey
S: :0