溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Redis中RESP協(xié)議的作用是什么

發(fā)布時(shí)間:2021-06-22 15:42:15 來源:億速云 閱讀:156 作者:Leah 欄目:大數(shù)據(jù)

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 的軟件。

數(shù)據(jù)類型及示例

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é)是 “*”

單行回復(fù)

以 “+” 開頭,以 “\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ò)誤信息

錯(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

整數(shù)

這種類型只是只是使用以 “:” 作為前綴,以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ù)組

數(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è)資訊頻道,感謝您對億速云的支持。

向AI問一下細(xì)節(jié)

免責(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)容。

AI