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左右的工作應該不會很難 當然這還取決於題主的學歷性格等等 其實前端看似很多新概念,但是其實天花板不高。建議做幾年前端再轉行後端。 拓幻...