一文聊聊Redis中的通信協議–RESP

本篇文章帶大家了解一下redis中的通信協議,介紹一下resp協議、數據結構的5種單元類型,希望對大家有所幫助!

一文聊聊Redis中的通信協議–RESP

RESP

RESP(redis Serialization Protocol)是Redis序列化協議的簡寫,該協議是純文本協議,實現過程簡單,解析性能較好。【相關推薦:Redis視頻教程

5種單元類型

Redis協議將傳輸的數據結構分為5種最小的單元類型,單元結束時統一加上回車換行符號rn。

1. 單行字符串以 + 符號開頭

例:+hello?worldrn

2. 多行字符串以 $ 符號開頭,后跟字符串長度

例:$11rnhello?worldrn

多行字符串也可以用于表示單行字符串

3. 整數值以 : 符號開頭,后跟整數的字符串形式

例::1024rn

4. 錯誤信息以 – 符號開頭

參數類型錯誤

例:?-WRONGTYPE?Operation?against?a?key?holding?the?wrong?kind?of?valuern

5. 數組以 * 號開頭,后跟數組的長度

例:*3rn:lrn:2rn:3rn

兩種特殊類型

1. NULL

NULL使用多行字符串表示,長度為-1

例:$-1rn

2. 空字符串

空串用多行字符串表示,長度填0

例:$0rnrn

空字符串有兩個rn,因為兩個rn之間的就是空串

客戶端請求服務端

客戶端向服務器發送的指令只有一種格式,就是多行字符串數組。

例如一個簡單的set指令 set x x 會被序列化成下面的字符串

*3rn$3rnsetrn$1rnxrn$1rnxrn

控制臺展示如下

*3 $3 set $1 x $1 x

服務端響應客戶端

服務端響應客戶端信息時,將會使用多種數據結構,比客戶端發送到服務端時復雜很多,不過即便很復雜,也是上面提到的5種基本類型的組合。

單行字符串響應

127?.?0?.0.1:?6379>?set?x?x? OK

上面的OK就是單行字符串響應(沒有雙引號),即 +OK

錯誤響應

127?.?0?.?0.1:6379>?incr?x? (error}?ERR?value?is?not?an?Integer?or?out?of?range

對一個字符串進行自增,服務器拋出錯誤提醒

-ERR value is not an integer or out of range

整數響應

127.0.0.1:6379>?incr?books? (integer}?1

1就是整數響應 :1

多行字符串響應

127.0.0.1:6379>?get?x  "x"

上面用括號引起來的x就是多行字符串響應,即:

$1 x

數組響應

127.0.0.1:6379>?hset?info?name?bibabo  (integer)?1  127.0.0.1:6379>?hset?info?age?18  (integer)?1  127.0.0.1:6379>?hset?info?sex?male  (integer)?1  127.0.0.1:6379>?hgetall?info  1)?"name"  2)?"bibabo"  3)?"age"  4)?"18"  5)?"sex"  6)?"male"

上面的hgetall命令返回的就是一個數組,第0、2、4的字符串是hash表的key,1、3、6則是value,客戶端負責將數組組裝成字典返回。

*6? $4? name? $6? bibabo? $3? age? $2? 18? $3? sex? $4? male

嵌套

127.0.0.1:6379>?scan?0? 1?)"0"? 2)?1?)?"info"? 2?)"books" 3?)"author"

scan命令用來掃描服務器包含的所有key列表,通過游標的形式一次獲取一部分,該命令返回的是一個嵌套數組,

數組第一個值表示游標的值,如果這個值為0,說明已經遍歷完畢,如果不為0,使用這個值作為下一次scan時的參數,

數組的第二個值又是一個數組,這個數組就是key的列表。

*2? $1 0 *3 $4? info $5? books? $6? author

Redis作為文本協議中含有大量的回車換行符,這會占用網絡流量,不過依然有很多項目使用RESP作為通訊協議,因為性能并不是評分的全部,簡單性、易理解性、易實現性都需要進行權衡,

一般數據庫的瓶頸很少在協議上,而是內部的邏輯處理,Redis使用一個單線程對外提供服務,在CPU跑滿的情況下,可以達到10w/s的QPS。

更多編程相關知識,請訪問:Redis視頻教程!!

? 版權聲明
THE END
喜歡就支持一下吧
點贊12 分享