您好,登錄后才能下訂單哦!
這篇文章主要介紹Redis 協議的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
Redis實例運行于單獨的進程,應用系統和Redis通過Redis協議進行交互。在Redis協議之上,客戶端和服務器可以實現多種典型的交互模式:串行的請求/響應模式、雙工的請求/響應模式(pipeline)、原子化的批量請求/響應模式(事務)、發布/訂閱模式、腳本化的批量執行(腳本模式)。
Redis的交互協議分為兩部分:網絡協議和序列化協議。
Redis協議位于TCP連接之上,即客戶端和Redis實例保持雙工的連接。
客戶端和服務器交互的內容是序列化后的相應類型的協議數據,服務器為每個客戶端建立對應的連接,在應用層維護一系列狀態保存在上圖的connection中,connection間相互無關聯。在Redis中,connection通過redisClient結構體實現。
在Redis中,協議數據分為不同的類型,每種類型的數據均以CRLF(\r\n)結束,通過數據的首字符區分類型。
這類數據表示Redis命令,首字符為Redis命令名的字符。
首字符為'+',后續字符為strig的內容,且該string不能包含'\r'或'\n'兩個字符,最后以'\r\n'結束。
simple string本身不含轉義,所以客戶端的反序列化效率很高,直接將'+'和最后兩個字節'\r\n'之間的內容拷貝即可。
對于string本身含有'\r'或'\n'的情況,解法有兩種:轉義和長度自描述。轉義反序列化效率低下,Redis采用的是長度自描述,稱為bulk string。
bulk string的首字符為'$',緊隨其后的是string數據的長度,'\r\n'之后緊跟著string的內容本身(可以包含包括'\r'和'\n'在內的特殊字符),最后以'\r\n'結束。
"$12\r\nhello\r\nworld\r\n"?這19個字節描述了hello\r\nworld這個兩行的string。
對于""空字符串和null,通過'$'之后的數字進行區分:
"$0\r\n\r\n"?這6個字節表示空字符串
"$-1\r\n"?這5個字節表示null
Redis中error類型的數據的內容就是一個普通的string,但是和普通的string的區別是error的首字符是'-'。客戶端直接通過首字符即可判斷本次交互是否出錯。
以':'開頭,緊跟著整形數字本身,最后以'\r\n'結尾。":13\r\n"表示整數13。
以'*'開頭,緊跟著數組的長度,'\r\n'之后就是數組中每個元素序列化的數據。"*2\r\n+abc\r\n:9\r\n"表示["abc", 9]。
數組長度為0或者-1分別表示空數組或null。
數組元素本身也可以是數組,多級數組是樹狀結構,采用類似先序遍歷的方式序列化。 "*2\r\n*2\r\n:1\r\n:2\r\n*1\r\n+abc\r\n"表示[[1, 2],["abc"]]。
客戶端發送給服務的類型:inline command、由bulk string組成的array。服務端發送給客戶端的類型為除了inline command之外的所有類型,并根據客戶端命令或者交互模式的不同進行確定。
以上是“Redis 協議的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。