Redis奇幻之旅(三)3. Redis的通信協(xié)議

3. Redis的通信協(xié)議

先貼一個 官方文檔

3.1 RESP

RESP(redis Serialization Protocol)是Redis的序列化協(xié)議精盅,主要優(yōu)勢在于:

- 實現(xiàn)過程簡單
- 解析性能極好
- 可讀性強(qiáng)

RESP可序列化不同的數(shù)據(jù)類型福压,包括:簡單字符串、錯誤類型巢块、整數(shù)、批量字符串和數(shù)組。請求從客戶端發(fā)送到Redis服務(wù)器,作為表示要執(zhí)行命令的參數(shù)的字符串?dāng)?shù)組众弓,Redis-server會使用特定的數(shù)據(jù)類型進(jìn)行回復(fù)。

RESP是二進(jìn)制安全的隔箍,不需要處理從一個進(jìn)程傳輸?shù)搅硪粋€進(jìn)程的批量數(shù)據(jù)谓娃,因為它使用前綴來確定是否傳輸批量數(shù)據(jù)。

注意:RESP 雖然是為 Redis 設(shè)計的蜒滩,但是同樣也可以用于其他 C/S 的軟件滨达。Redis Cluster使用不同的二進(jìn)制協(xié)議(gossip)奶稠,以便在節(jié)點之間交換消息。

Redis協(xié)議將傳輸?shù)慕Y(jié)構(gòu)數(shù)據(jù)分為5種最小單元類型捡遍,單元結(jié)束時統(tǒng)一加上回車換行符"\r\n"(CRLF)結(jié)束锌订。

  • "+"表示簡單字符串 Simple Strings,即:單行字符串
  • "$"表示批量字符串Bulk Strings画株,后跟字符串長度
  • ":"表示整數(shù)
  • "-"表示錯誤消息
  • "*"表示數(shù)組

3.2 驗證RESP

SET key value #對應(yīng)的resp通信協(xié)議串

*3
$3
SET
$3
key
$5
value

第一次看到這個通信協(xié)議串辆飘,看不懂不必?fù)?dān)心,我們按照RESP的協(xié)議說明慢慢看谓传,并且下文會有詳細(xì)的講解蜈项。
這里大概翻譯一下這段傳輸?shù)臄?shù)據(jù)含義:

  • 第一行*3表示這條發(fā)給Redis server的命令是數(shù)組,數(shù)組有3個元素(其實就是SET续挟、key紧卒、value這仨字符串);
    后面的6行數(shù)據(jù)诗祸,分別是對數(shù)組三個元素的表示跑芳,每個元素用兩行;
  • 數(shù)組第一個元素:<3 SET> `3`代表Bulk Strings字符串長度為3直颅,內(nèi)容是SET博个。
  • 數(shù)組第二個元素:<3 key> `3`代表Bulk Strings字符串長度為3,內(nèi)容是key功偿。
  • 數(shù)組第三個元素:$5 value``$5代表Bulk Strings字符串長度為5坡倔,內(nèi)容是value。

3.3 具體類型說明

3.3.1簡單字符串Simple Strings

簡單字符串按以下方式編碼:+字符脖含,后跟不能包含CR或LF字符的字符串(不允許換行),由CRLF終止(即“\r\n”)投蝉。
Simple Strings用于以最小的開銷养葵、傳輸非二進(jìn)制安全字符串。例如瘩缆,許多Redis命令在成功時僅回復(fù)“OK”关拒,因為RESP Simple String使用以下5個字節(jié)進(jìn)行編碼:
+OK\r\n

當(dāng)Redis使用Simple String回復(fù)時,該字符串由'+'之后的第一個字符組成庸娱,直到字符串結(jié)尾着绊,不包括最終的CRLF字節(jié)。

3.3.2 RESP錯誤

RESP具有特定的錯誤數(shù)據(jù)類型熟尉。實際上錯誤與RESP Simple Strings完全相同归露,但第一個字符是減-字符而不是加號。RESP中簡單字符串和錯誤之間的真正區(qū)別在于客戶端將錯誤視為異常斤儿,組成錯誤類型的字符串是錯誤消息本身剧包。
基本格式是:-ERR errorMsg\r\n

錯誤回復(fù)僅在發(fā)生錯誤時發(fā)送恐锦,例如,如果你嘗試對錯誤的數(shù)據(jù)類型執(zhí)行操作疆液,或者命令不存在等等一铅。收到錯誤答復(fù)時,庫客戶端應(yīng)引發(fā)異常堕油。
以下是錯誤回復(fù)的示例:

-ERR unknown command 'foobar'
-WRONGTYPE Operation against a key holding the wrong kind of value

“-”之后的第一個單詞潘飘,直到第一個空格或換行符,表示返回的錯誤類型掉缺。這只是Redis使用的約定卜录,不是RESP錯誤格式的一部分。
例如攀圈,ERR是一般錯誤暴凑,而WRONGTYPE更具體的錯誤意味著客戶端嘗試對錯誤的數(shù)據(jù)類型執(zhí)行操作。這稱為錯誤前綴赘来,是一種允許客戶端理解服務(wù)器返回的錯誤類型的方法现喳,而不依賴于給定的確切消息,這可能隨時間而變化犬辰。

下面是幾個使用redis-cli的實際錯誤的例子:

127.0.0.1:6379> TaoBeier
-ERR unknown command 'TaoBeier'\r\n  # 服務(wù)端實際返回, 下同
---
(error) ERR unknown command 'TaoBeier'  # redis-cli 客戶端顯示, 下同
127.0.0.1:6379> set name TaoBeier love
-ERR syntax error\r\n
---
(error) ERR syntax error

客戶端實現(xiàn)可以針對不同的錯誤返回不同類型的異常嗦篱,或者可以通過直接將錯誤名稱作為字符串提供給調(diào)用者來提供捕獲錯誤的通用方法。
但是幌缝,錯誤類型很少有用灸促,并且有限的客戶端實現(xiàn)可能只是返回一般的錯誤條件,例如false涵卵。

3.3.3整數(shù)類型

此類型只是一個CRLF終止的字符串浴栽,表示一個以字節(jié)為前綴的整數(shù)。例如:0 \r\n:1000 \r\n是整數(shù)回復(fù)轿偎。

很多Redis命令返回RESP整數(shù)類型典鸡,比如INCR,LLEN和LASTSAVE坏晦。
返回的整數(shù)沒有特殊含義萝玷,它只是INCR的增量數(shù),LASTSAVE的UNIX時間等等昆婿。但是球碉,返回的整數(shù)保證在有符號的64位整數(shù)范圍內(nèi)。

整數(shù)回復(fù)也被廣泛使用以返回真或假仓蛆。例如睁冬,EXISTS或SISMEMBER之類的命令將返回1表示true,0表示false表示看疙。
如果操作實際執(zhí)行痴突,其他命令如SADD搂蜓,SREM和SETNX將返回1,否則返回0辽装。

下面的命令都是整數(shù)類型回復(fù):SETNX帮碰,DEL, EXISTS拾积,INCR殉挽,INCRBY,DECR拓巧,DECRBY斯碌,DBSIZE,LASTSAVE肛度, RENAMENX傻唾,MOVE,LLEN承耿,SADD冠骄,SREM,SISMEMBER加袋,SCARD凛辣。

3.3.4 Bulk Strings類型

翻譯過來,是指批量职烧、多行字符串扁誓。
Bulk Strings用于表示長度最大為512MB的單個二進(jìn)制安全字符串。
批量字符串按以下方式編碼:

  • 一個$字節(jié)后跟組成字符串的字節(jié)數(shù)(一個前綴長度)蚀之,由CRLF終止蝗敢。
  • 實際的字符串?dāng)?shù)據(jù)。
  • 最終的CRLF足删。
    所以字符串“foobar”的編碼如下:
$6\r\n
foobar\r\n"

一個完整的Bulk Strings前普,主要包括兩行:
第一行,$后面跟上字符串長度壹堰;
第二行,就是實際的字符串骡湖。
如下面執(zhí)行set贱纠、get的例子:

127.0.0.1:6379> set site ljheee
+OK\r\n  # 服務(wù)端實際返回, 下同
---
OK   # redis-cli 客戶端顯示, 下同
127.0.0.1:6379> get site
$6\r\
ljheee\r\n
---
"ljheee"

在執(zhí)行set site value時,客戶端給Redis server發(fā)送RESP命令后响蕴,Redis server返回的是simple strings類型+OK\r\n谆焊,redis-cli命令行客戶端給我們只顯示了有效字符、省略了最后的CRLF浦夷。
在執(zhí)行get site時辖试,Redis server返回的是Bulk Strings類型辜王,第一行$6代表site對應(yīng)的value值length為6,第二行是實際value值罐孝。

當(dāng)只是一個空字符串時呐馆,表示為:$0\r\n
Bulk Strings也可用于使用用于表示Null值的特殊格式來表示值的不存在。在這種特殊格式中莲兢,長度為-1汹来,并且沒有數(shù)據(jù),因此Null表示為:$-1\r\n改艇,這稱為Null Bulk String收班。

3.3.5 數(shù)組類型

客戶端使用數(shù)組、將命令發(fā)送到Redis服務(wù)器谒兄。類似地摔桦,某些Redis命令將元素集合返回給客戶端使用數(shù)組類型回復(fù)。如LRANGE命令承疲,它返回元素列表其實就是數(shù)組類型邻耕。

RESP數(shù)組使用以下格式發(fā)送:

  • 它以 “*” 開頭,后面跟著返回元素的個數(shù)纪隙,后跟CRLF赊豌。
  • 然后就是數(shù)組中各元素自己的類型了,數(shù)組每個元素可以是任意的RESP類型绵咱。

最典型的是 LRRANGE 命令碘饼,返回的就是數(shù)組類型

LRANGE info 0 -1
*2\r\n
$3\r\
abc\r\n
$6\r\n
ljheee\r\n
--- # 實際redis-cli顯示
1) "abc"
2) "ljheee"

返回的結(jié)果,*2代表數(shù)組長度為2悲伶,數(shù)組的第一個元素$3是長度為3的字符串a(chǎn)bc艾恼;數(shù)組的第二個元素$6是長度為6的字符串ljheee。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載麸锉,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者钠绍。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市花沉,隨后出現(xiàn)的幾起案子柳爽,更是在濱河造成了極大的恐慌,老刑警劉巖碱屁,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件磷脯,死亡現(xiàn)場離奇詭異,居然都是意外死亡娩脾,警方通過查閱死者的電腦和手機(jī)赵誓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人俩功,你說我怎么就攤上這事幻枉。” “怎么了诡蜓?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵熬甫,是天一觀的道長。 經(jīng)常有香客問我万牺,道長罗珍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任脚粟,我火速辦了婚禮覆旱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘核无。我一直安慰自己扣唱,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布团南。 她就那樣靜靜地躺著噪沙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吐根。 梳的紋絲不亂的頭發(fā)上正歼,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天,我揣著相機(jī)與錄音拷橘,去河邊找鬼局义。 笑死,一個胖子當(dāng)著我的面吹牛冗疮,可吹牛的內(nèi)容都是我干的萄唇。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼术幔,長吁一口氣:“原來是場噩夢啊……” “哼另萤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起诅挑,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤四敞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拔妥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體忿危,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年毒嫡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡兜畸,死狀恐怖努释,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情咬摇,我是刑警寧澤伐蒂,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站肛鹏,受9級特大地震影響逸邦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜在扰,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一缕减、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧芒珠,春花似錦桥狡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至娜汁,卻和暖如春嫂易,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背掐禁。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工怜械, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人穆桂。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓宫盔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親享完。 傳聞我的和親對象是個殘疾皇子灼芭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348