共計 1709 個字符,預計需要花費 5 分鐘才能閱讀完成。
這篇文章主要介紹了 Redis 中通信協議 RESP 是怎么實現的,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓丸趣 TV 小編帶著大家一起了解一下。
RESP
RESP(Redis Serialization Protocol) 是 Redis 序列化協議的簡寫,該協議是純文本協議,實現過程簡單,解析性能較好。
5 種單元類型
Redis 協議將傳輸的數據結構分為 5 種最小的單元類型,單元結束時統一加上回車換行符號 \r\n。
1. 單行字符串以 + 符號開頭
例:+hello world\r\n
2. 多行字符串以 $ 符號開頭,后跟字符串長度
例:$11\r\nhello world\r\n
多行字符串也可以用于表示單行字符串
3. 整數值以 : 符號開頭,后跟整數的字符串形式
例::1024\r\n
4. 錯誤信息以 – 符號開頭
參數類型錯誤
例: -WRONGTYPE Operation against a key holding the wrong kind of value\r\n
5. 數組以 * 號開頭,后跟數組的長度
例:*3\r\n:l\r\n:2\r\n:3\r\n
兩種特殊類型
1. NULL
NULL 使用多行字符串表示,長度為 -1
例:$-1\r\n
2. 空字符串
空串用多行字符串表示,長度填 0
例:$0\r\n\r\n
空字符串有兩個 \r\n,因為兩個 \r\n 之間的就是空串
客戶端請求服務端
客戶端向服務器發送的指令只有一種格式,就是多行字符串數組。
例如一個簡單的 set 指令 set x x 會被序列化成下面的字符串
*3\r\n$3\r\nset\r\n$1\r\nx\r\n$1\r\nx\r\n
控制臺展示如下
*3
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
$4
$5
books
$6
author
感謝你能夠認真閱讀完這篇文章,希望丸趣 TV 小編分享的“Redis 中通信協議 RESP 是怎么實現的”這篇文章對大家有幫助,同時也希望大家多多支持丸趣 TV,關注丸趣 TV 行業資訊頻道,更多相關知識等著你來學習!