前言
簡單介紹一下用戶端的通信協定。
正文
第 一,用戶端與服務端之間的通信協定是在TCP協定之上建構的。
第二, Redis制定了RESP(REdis Serialization Protocol,Redis序列化協定)實作用戶端與服務端的正常互動,這種協定簡單高效,既能夠被機器解析,又容易 被人類識别。
例如用戶端發送一條set hello world指令給服務端,按照RESP 的标準,用戶端需要将其封裝為如下格式(每行用\r\n分隔):

這樣Redis服務端能夠按照RESP将其解析為set hello world指令,執行後 回複的格式如下:
可以看到除了指令(set hello world)和傳回結果(OK)本身還包含了 一些特殊字元以及數字,下面将對這些格式進行說明。
- 發送指令的格式
RESP的規定一條指令的格式如下,CRLF代表"\r\n"。
*<參數數量> CRLF
$<參數1的位元組數量> CRLF
<參數1>
CRLF ...
$<參數N的位元組數量> CRLF
<參數N> CRLF
參數數量為3個,是以第一行為:
*3
參數位元組數分别是355,是以後面幾行為:
$3
SET
$5
hello
$5
world
有一點要注意的是,上面隻是格式化顯示的結果,實際傳輸格式為如下代碼:
*3\r\n$3\r\nSET\r\n$5\r\nhello\r\n$5\r\nworld\r\n
傳回格式:
Redis的傳回結果類型分為以下五種
·狀态回複:在RESP中第一個位元組為"+"。
·錯誤回複:在RESP中第一個位元組為"-"。
·整數回複:在RESP中第一個位元組為":"。
·字元串回複:在RESP中第一個位元組為"$"。
·多條字元串回複:在RESP中第一個位元組為"*"。
static sds cliFormatReplyTTY(redisReply *r, char *prefix)
{ sds out = sdsempty();
switch (r->type)
{
case REDIS_REPLY_ERROR:
// 處理錯誤回複
case REDIS_REPLY_STATUS:
// 處理狀态回複
case REDIS_REPLY_INTEGER:
// 處理整數回複
case REDIS_REPLY_STRING:
// 處理字元串回複
case REDIS_REPLY_NIL:
// 處理空
case REDIS_REPLY_ARRAY:
// 處理多條字元串回複
return out;
}
那麼直接用telnet和nc分别實作一下啊,直接弄用協定寫一下。
後面幾個可以自己玩一下。
有一點需要注意,無論是字元串回複還是多條字元串回複,如果有nil 值,那麼會傳回$-1。