天天看點

redis 簡單整理——用戶端通信協定[十五]

前言

簡單介紹一下用戶端的通信協定。

正文

第 一,用戶端與服務端之間的通信協定是在TCP協定之上建構的。

第二, Redis制定了RESP(REdis Serialization Protocol,Redis序列化協定)實作用戶端與服務端的正常互動,這種協定簡單高效,既能夠被機器解析,又容易 被人類識别。

例如用戶端發送一條set hello world指令給服務端,按照RESP 的标準,用戶端需要将其封裝為如下格式(每行用\r\n分隔):

redis 簡單整理——用戶端通信協定[十五]

這樣Redis服務端能夠按照RESP将其解析為set hello world指令,執行後 回複的格式如下:

redis 簡單整理——用戶端通信協定[十五]

可以看到除了指令(set hello world)和傳回結果(OK)本身還包含了 一些特殊字元以及數字,下面将對這些格式進行說明。

  1. 發送指令的格式

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分别實作一下啊,直接弄用協定寫一下。

redis 簡單整理——用戶端通信協定[十五]
redis 簡單整理——用戶端通信協定[十五]
redis 簡單整理——用戶端通信協定[十五]

後面幾個可以自己玩一下。

有一點需要注意,無論是字元串回複還是多條字元串回複,如果有nil 值,那麼會傳回$-1。

上一篇: Java:SPI機制
下一篇: 項目管理