Redis 協議將傳輸的結構數據分為 5 種最小單元類型,單元結束時統一加上回車換行符號\r\n。
1、單行字符串 以 + 符號開頭。
2、多行字符串 以 $ 符號開頭,后跟字符串長度。
3、整數值 以 : 符號開頭,后跟整數的字符串形式。
4、錯誤消息 以 - 符號開頭。
5、數組 以 * 號開頭,后跟數組的長度。
單行字符串 hello world
+hello world\r\n
多行字符串 hello world
$11\r\nhello world\r\n
多行字符串當然也可以表示單行字符串。
整數 1024
:1024\r\n
錯誤 參數類型錯誤
-WRONGTYPE Operation against a key holding the wrong kind of value
數組 [1,2,3]
*3\r\n:1\r\n:2\r\n:3\r\n
NULL 用多行字符串表示,不過長度要寫成-1。
$-1\r\n
空串 用多行字符串表示,長度填 0。
$0\r\n\r\n
注意這里有兩個\r\n。為什么是兩個? 因為兩個\r\n 之間,隔的是空串。
客戶端 -> 服務器
客戶端向服務器發送的指令只有一種格式,多行字符串數組。比如一個簡單的 set 指令
set author codehole 會被序列化成下面的字符串。
*3\r\n$3\r\nset\r\n$6\r\nauthor\r\n$8\r\ncodehole\r\n
在控制台輸出這個字符串如下,可以看出這是很好閱讀的一種格式。
*3
$3
set
$6
author
$8
codehole
服務器 -> 客戶端
服務器向客戶端回復的響應要支持多種數據結構,所以消息響應在結構上要復雜不少。
不過再復雜的響應消息也是以上 5 中基本類型的組合。
單行字符串響應
127.0.0.1:6379> set author codehole
OK
這里的 OK 就是單行響應,沒有使用引號括起來。
+OK
錯誤響應
127.0.0.1:6379> incr author
(error) ERR value is not an integer or out of range
試圖對一個字符串進行自增,服務器拋出一個通用的錯誤。
-ERR value is not an integer or out of range
第 97 頁 共 226 頁Redis 深度歷險:核心原理與應用實踐 | 錢文品 著
整數響應
127.0.0.1:6379> incr books
(integer) 1
這里的 1 就是整數響應
:1
多行字符串響應
127.0.0.1:6379> get author
"codehole"
這里使用雙引號括起來的字符串就是多行字符串響應
$8
codehole
數組響應
127.0.0.1:6379> hset info name laoqian
(integer) 1
127.0.0.1:6379> hset info age 30
(integer) 1
127.0.0.1:6379> hset info sex male
(integer) 1
127.0.0.1:6379> hgetall info
1) "name"
2) "laoqian"
3) "age"
4) "30"
5) "sex"
6) "male"
這里的 hgetall 命令返回的就是一個數值,第 0|2|4 位置的字符串是 hash 表的 key,第
1|3|5 位置的字符串是 value,客戶端負責將數組組裝成字典再返回。
*6
$4
第 98 頁 共 226 頁Redis 深度歷險:核心原理與應用實踐 | 錢文品 著
name
$6
laoqian
$3
age
$2
30
$3
sex
$4
male
嵌套
127.0.0.1:6379> scan 0
1) "0"
2) 1) "info"
2) "books"
3) "author"
scan 命令用來掃描服務器包含的所有 key 列表,它是以游標的形式獲取,一次只獲取
一部分。
scan 命令返回的是一個嵌套數組。數組的第一個值表示游標的值,如果這個值為零,說
明已經遍歷完畢。如果不為零,使用這個值作為 scan 命令的參數進行下一次遍歷。數組的
第二個值又是一個數組,這個數組就是 key 列表。
*2
$1
0
*3
$4
info
$5
books
第 99 頁 共 226 頁Redis 深度歷險:核心原理與應用實踐 | 錢文品 著
$6
author