您好,登錄后才能下訂單哦!
Redis中RESP協議的作用是什么,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
Redis 的客戶端和服務端之間采取了一種獨立的名為 RESP(REdis Serialization Protocol) 的協議,作者主要考慮了以下幾個點:
容易實現
解析快
人類可讀
注意:RESP 雖然是為 Redis 設計的,但是同樣也可以用于其他 C/S 的軟件。
RESP 主要可以序列化以下幾種類型:整數,單行回復(簡單字符串),數組,錯誤信息,多行字符串。Redis 客戶端向服務端發送的是一組由執行的命令組成的字符串數組,服務端根據不同的命令回復不同類型的數據,但協議的每部分都是以 “\r\n” (CRLF) 結尾的。另外 RESP 是二進制安全的,不需要處理從一個進程到另一個進程的傳輸,因為它使用了前綴長度進行傳輸。
在 RESP 中, 一些數據的類型通過它的第一個字節進行判斷:
單行回復:回復的第一個字節是 “+”
錯誤信息:回復的第一個字節是 “-“
整形數字:回復的第一個字節是 “:”
多行字符串:回復的第一個字節是 “$“
數組:回復的第一個字節是 “*”
以 “+” 開頭,以 “\r\n” 結尾的字符串形式。e.g.
+OK\r\n
響應的客戶端庫,應該返回除 “+” 和 CRLF 以外的內容,例如上面的內容,則返回 “OK”. e.g.
127.0.0.1:6379> set name TaoBeier +OK\r\n # 服務端實際返回 --- OK # redis-cli 客戶端顯示
錯誤信息和單行回復很像,不過是把 “+” 替換成了 “-“。而這兩者之間真正的區別是,錯誤信息會被客戶端視為異常,并且組成錯誤類型的是錯誤消息本身。e.g.
-Error message\r\n
錯誤信息只在有錯誤發生的時候才會發送,比如數據類型錯誤,語法錯誤,或者命令不存在之類的。而當接收到錯誤信息的時候,客戶端庫應該拋出一個異常。e.g.
127.0.0.1:6379> TaoBeier -ERR unknown command 'TaoBeier'\r\n # 服務端實際返回, 下同 --- (error) ERR unknown command 'TaoBeier' # redis-cli 客戶端顯示, 下同 127.0.0.1:6379> set name TaoBeier moelove -ERR syntax error\r\n --- (error) ERR syntax error
這種類型只是只是使用以 “:” 作為前綴,以CRLF作為結尾的字符串來表示整數。e.g. “:666\r\n” 或者 “:999\r\n” 這種的都是整數回復。很多命令都會返回整數回復,例如 INCR
LLEN
LPUSH
之類的命令。但是多數情況下,返回的整數回復并沒有過多實際含義,例如 LPUSH
就只是為了表示插入了幾個值,但也有例如 EXISTS
命令是當結果為 true 的時候返回 1,false 返回 0 . e.g.
127.0.0.1:6379> LPUSH info TaoBeier MoeLove :2\r\n # 服務端實際返回, 下同 --- (integer) 2 # redis-cli 客戶端顯示, 下同 127.0.0.1:6379> LLEN info :2\r\n --- (integer) 2 127.0.0.1:6379> EXISTS info :1\r\n --- (integer) 1 127.0.0.1:6379> DEL info :1\r\n --- (integer) 1 127.0.0.1:6379> EXISTS info :0\r\n --- (integer) 0
多行字符串被服務端用來返回長度最大為 512MB 的單個二進制安全的字符串。以 “$“ 開頭, 后跟實際要發送的字節數,隨后是 CRLF,然后是實際的字符串數據,最后以 CRLF 結束。所以,例如我們要發送一個 “moelove.info” 的字符串,那它實際就被編碼為 “$12\r\nmoelove.info\r\n”。而如果一個要發送一個空字符串,則會編碼為 “$0\r\n\r\n” 。某些情況下,當要表示不存在的值時候,則以 “$-1\r\n” 返回,這被叫做空多行字符串,當客戶端庫接收到這個響應的時候,同樣應該返回一個空值(例如 nil
)而不是一個空字符串。e.g.
127.0.0.1:6379> set site moelove.info +OK\r\n # 服務端實際返回, 下同 --- OK # redis-cli 客戶端顯示, 下同 127.0.0.1:6379> get site $12\r\nmoelove.info\r\n --- "moelove.info" 127.0.0.1:6379> del site :1\r\n --- (integer) 1 127.0.0.1:6379> get site $-1\r\n --- (nil) 127.0.0.1:6379> set site '' +OK\r\n --- OK 127.0.0.1:6379> get site $0\r\n\r\n --- ""
數組類型可用于客戶端向服務端發送命令,同樣的當某些命令將元素結合返回給客戶端的時候,也是使用數組類型作為回復類型的。它以 “*” 開頭,后面跟著返回元素的個數,隨后是 CRLF, 再然后就是數組中各元素自己的類型了。最典型的是 LRRANGE
命令,返回一個列表中的元素。e.g.
127.0.0.1:6379> LPUSH info TaoBeier moelove.info :2\r\n # 服務端實際返回, 下同 --- (integer) 2 # redis-cli 客戶端顯示, 下同 127.0.0.1:6379> LRANGE info 0 -1 *2\r\n$12\r\nmoelove.info\r\n$8\r\nTaoBeier\r\n --- 1) "moelove.info" 2) "TaoBeier" 127.0.0.1:6379> LPOP info $12\r\nmoelove.info\r\n --- "moelove.info" 127.0.0.1:6379> LPOP info $8\r\nTaoBeier\r\n --- "TaoBeier" 127.0.0.1:6379> LRANGE info 0 -1 *0\r\n --- (empty list or set)
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。