本篇文章帶大家了解一下redis中的通信協議,介紹一下resp協議、數據結構的5種單元類型,希望對大家有所幫助!
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視頻教程!!