程式語言和redis通訊用的什麼協議?

時間 2021-06-06 08:36:51

1樓:eechen

Redis客戶端跟Redis服務通訊使用的是Redis自己定義的乙個基於TCP的文字協議,名字叫RESP。你可以把程式跟Redis建立的連線理解為乙個HTTP長連線,Redis客戶端傳送請求(Redis命令),Redis伺服器處理命令,把處理結果返回給客戶端,跟HTTP的請求響應模型一模一樣。

RESP協議和HTTP協議最大的區別是RESP沒有HTTP裡的訊息頭和訊息體的區分,相同點是都採用換行符\r\n進行引數分隔,特點是定義一些符號來表達這個是什麼引數,。

其實我很好奇,Redis作者在設計Redis通訊協議時,為什麼不直接採用相容HTTP協議的協議,這樣幾乎所有支援發起HTTP請求的開發語言就不需要專門的Redis客戶端就能使用。這個思想,我在張宴的部落格(老部落格了)看過,記得好像他寫的KV還是佇列服務用的就是HTTP進行通訊。

Redis Protocol specification - Redis

RESP中這幾個符號開頭表示特殊含義.

在RESP,某些資料的型別取決於第乙個位元組:

對於簡單字串,回覆的第乙個位元組是"+"

對於錯誤,回覆的第乙個位元組是"-"

對於整數,回覆的第乙個位元組是":"

對於批量字串,回覆的第乙個位元組是"$"

對於陣列,回覆的第乙個位元組是"*"

Redis命令在RESP中的格式舉例(換行符都是\r\n):

例子1: set foo bar

*3$3

set$3

foo$3

bar+OK 這個是響應,加號表示簡單字串,也就是返回值是字串"OK",注意,這個後面有換行)

例子2: zadd rank:202102 1 foo 2 bar

*6 後面是引數陣列,有6個元素

$4 後面是乙個字串,包含4個字元,也就是"zadd"

zadd 引數

$11 後面是乙個字串,包含11個字元,也就是"rank:202102"

rank:202102

$1 後面是乙個字串,包含1個字元,也就是"1"

1 引數

$3 後面是乙個字串,包含3個字元,也就是"foo"

foo 引數

$1 後面是乙個字串,包含1個字元,也就是"2"

2 引數

$3 後面是乙個字串,包含3個字元,也就是"foo"

bar 引數

:2 這個是響應,冒號表示整數,也就是返回值是整數2,注意,這個後面有換行)

2樓:Tony

協議就像我們人類的語言。

比如:你說中文,另外乙個英中國人說英語,你們都沒有學習對方的語言,那麼你們就不能溝通。

所以,兩個程式能溝通的前提是:他們都懂這個語言,也就是這個協議。

至於協議如何設計,就如同語言如何創造是一樣的,你可以發明自己的協議,只要另外一方能懂。Redis就是創作了自己一套語言,詳細你可以參考官網。Redis Protocol specification - Redis

還有乙個方法就是增加乙個翻譯。你說中文,對方說英文,翻譯幫你們互轉。在計算機裡,這個叫做Proxy。

乙個人可以懂多種語言,乙個程式也可以懂多個協議。

協議也可以包括多層,比如:我們想用密語交流,表面交流的是中文,但中文裡面的字代表了特殊的含義。這就是兩個協議,乙個協議是中文,另外乙個協議依賴中文,但同時有自己的密碼本。

Redis協議依賴TCP協議,就是這個概念。

兩個程式不懂對方的協議,就是雞同鴨講。

3樓:程式設計師歷小冰

程式語言使用各自語言的 Redis 客戶端通過序列化協議(RESP)協議和 Redis Server 進行通訊。RESP是一種文字協議,它有以下特點

容易實現

解析快人類可讀

具體協議定義可以檢視 Redis 的官方文件,這裡就舉個例子,對於命令"set test1 1" 一般被序列化成

*3\r\n$3\r\nset\r\n$5\r\ntest1\r\n$1\r\n1\r\n

-- 為了方便理解, 每個CRLF我們給它換一下行

*3\r\n這個命令包含3個(bulk)字串

$3\r\n第乙個bulk string有3個位元組

set\r\n第乙個bulk string是set

$5\r\n第二個bulk string有5個位元組

test1\r\n -- 第二個bulk string是test1

$1\r\n第三個bulk string有1個位元組

1\r\n第三個bulk string是1

有關 Redis 命令執行和解析的可以檢視

Redis 命令執行過程

4樓:青玉白露

Redis跟程式語言通訊?

你想問的應該是Redis設計的介面吧?如果是這樣的話,看一遍Redis的原始碼你就懂了。

Redis原始碼(1)基本資料結構、SDS、字典Dict、跳表skiplist - 青玉白露的文章 - 知乎 https://

zhuanlan /p/360087451

應該怎麼理解程式語言中的協變逆變?

花生炒花生 約定 A B 意味著 A 是 B 的子型別 A B 指的是以 A 為引數型別,以 B 為返回值型別的函式型別 x A 意味著 x 的型別為 A 協變和逆變的概念可以借助實際的變數型別來理解 協變和普通變數 在 C 中,List 類實現 IEnumerable 介面,因此 List 實現 ...

歐洲有什麼語言和語言的分布?

Ricky Lam 印歐語系1.羅曼語族 或稱拉丁語族 包括義大利語 法語 西班牙語 葡萄牙語 羅馬尼亞語 加泰隆語 加利西亞語 摩爾達維亞語 雷托羅曼語等。廣泛分布於南歐的伊比利亞 亞平寧和西歐的高盧地區,另外東南歐的巴爾幹半島北部也有分布。2.日耳曼語族 分為西日耳曼語支和北日耳曼諾支,前者包括...

女生,只會了解簡單的c語言和php,無程式設計基礎。想學技術,是學web前端好,還是ar好?

phenom 推薦web前端。首先題主有c和php基礎,入門web前端的話,應該很快。有php基礎更加有優勢。再者現在web前端比較火,如果在一線城市的話,找乙份5k左右的工作應該不會很難 當然這還取決於題主的學歷性格等等 其實前端看似很多新概念,但是其實天花板不高。建議做幾年前端再轉行後端。 拓幻...