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