溫馨提示×

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

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

Redis中通信協(xié)議RESP是怎么實(shí)現(xiàn)的

發(fā)布時(shí)間:2021-12-21 09:33:43 來源:億速云 閱讀:163 作者:小新 欄目:關(guān)系型數(shù)據(jù)庫(kù)

這篇文章主要介紹了Redis中通信協(xié)議RESP是怎么實(shí)現(xiàn)的,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

RESP

RESP(Redis Serialization Protocol)是Redis序列化協(xié)議的簡(jiǎn)寫,該協(xié)議是純文本協(xié)議,實(shí)現(xiàn)過程簡(jiǎn)單,解析性能較好。

5種單元類型

Redis協(xié)議將傳輸?shù)臄?shù)據(jù)結(jié)構(gòu)分為5種最小的單元類型,單元結(jié)束時(shí)統(tǒng)一加上回車換行符號(hào)\r\n。

1. 單行字符串以 + 符號(hào)開頭

例:+hello world\r\n

2. 多行字符串以 $ 符號(hào)開頭,后跟字符串長(zhǎng)度

例:$11\r\nhello world\r\n

多行字符串也可以用于表示單行字符串

3. 整數(shù)值以 : 符號(hào)開頭,后跟整數(shù)的字符串形式

例::1024\r\n

4. 錯(cuò)誤信息以 - 符號(hào)開頭

參數(shù)類型錯(cuò)誤

例: -WRONGTYPE Operation against a key holding the wrong kind of value\r\n

5. 數(shù)組以 * 號(hào)開頭,后跟數(shù)組的長(zhǎng)度

例:*3\r\n:l\r\n:2\r\n:3\r\n

兩種特殊類型

1. NULL

NULL使用多行字符串表示,長(zhǎng)度為-1

例:$-1\r\n

2. 空字符串

空串用多行字符串表示,長(zhǎng)度填0

例:$0\r\n\r\n

空字符串有兩個(gè)\r\n,因?yàn)閮蓚€(gè)\r\n之間的就是空串

客戶端請(qǐng)求服務(wù)端

客戶端向服務(wù)器發(fā)送的指令只有一種格式,就是多行字符串?dāng)?shù)組。

例如一個(gè)簡(jiǎn)單的set指令 set x x 會(huì)被序列化成下面的字符串

*3\r\n$3\r\nset\r\n$1\r\nx\r\n$1\r\nx\r\n

控制臺(tái)展示如下

*3
$3
set
$1
x
$1
x

服務(wù)端響應(yīng)客戶端

服務(wù)端響應(yīng)客戶端信息時(shí),將會(huì)使用多種數(shù)據(jù)結(jié)構(gòu),比客戶端發(fā)送到服務(wù)端時(shí)復(fù)雜很多,不過即便很復(fù)雜,也是上面提到的5種基本類型的組合。

單行字符串響應(yīng)

127 . 0 .0.1: 6379> set x x 
OK

上面的OK就是單行字符串響應(yīng)(沒有雙引號(hào)),即 +OK

錯(cuò)誤響應(yīng)

127 . 0 . 0.1:6379> incr x 
(error} ERR value is not an integer or out of range

對(duì)一個(gè)字符串進(jìn)行自增,服務(wù)器拋出錯(cuò)誤提醒

-ERR value is not an integer or out of range

整數(shù)響應(yīng)

127.0.0.1:6379> incr books 
(integer} 1

1就是整數(shù)響應(yīng) :1

多行字符串響應(yīng)

127.0.0.1:6379> get x

"x"

上面用括號(hào)引起來的x就是多行字符串響應(yīng),即:

$1
x

數(shù)組響應(yīng)

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命令返回的就是一個(gè)數(shù)組,第0、2、4的字符串是hash表的key,1、3、6則是value,客戶端負(fù)責(zé)將數(shù)組組裝成字典返回。

*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命令用來掃描服務(wù)器包含的所有key列表,通過游標(biāo)的形式一次獲取一部分,該命令返回的是一個(gè)嵌套數(shù)組,

數(shù)組第一個(gè)值表示游標(biāo)的值,如果這個(gè)值為0,說明已經(jīng)遍歷完畢,如果不為0,使用這個(gè)值作為下一次scan時(shí)的參數(shù),

數(shù)組的第二個(gè)值又是一個(gè)數(shù)組,這個(gè)數(shù)組就是key的列表。

*2 
$1
0
*3
$4 
info
$5 
books 
$6 
author

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Redis中通信協(xié)議RESP是怎么實(shí)現(xiàn)的”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!

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

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI