久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Redis?RESP協議如何實現

328次閱讀
沒有評論

共計 1817 個字符,預計需要花費 5 分鐘才能閱讀完成。

本文丸趣 TV 小編為大家詳細介紹“Redis RESP 協議如何實現”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Redis RESP 協議如何實現”文章能幫助大家解決疑惑,下面跟著丸趣 TV 小編的思路慢慢深入,一起來學習新知識吧。

回顧 RESP 協議

RESP 是基于 TCP 來實現的 Redis 通信協議,該協議是以 /r/n(行) 進行分割的,協議支持 5 種類型,具體信息如下:

類型前綴備注簡單字符串 + 簡單字符串以 + 開頭錯誤數據 - 錯誤數據以 - 開頭整數: 整數以: 開頭復雜字符串 $ 復雜字符串以 $ 開頭數組 * 數組以 * 開頭

即,我們向 redis 發送命令:set name pdudo,其實發送的具體信息是

*3
pdudo

而服務器返回的信息也是類似的,只不過還需要了解 + 和 -,這 2 個前綴分別代表正確消息和錯誤的消息。

我們準備 2 個例子,我們來敲一下

例子 1

set name pdudo

例子 2

lpush pdudo data1
lpush pdudo data2
lrange pdudo 0 -1

快來動動你的小手指,看能不能根據 RESP 協議規則,將上述例子命令敲出來。現在你體會到了 Redis 官網介紹 RESP 協議時所述的 簡單 和 易讀 可么?

對于 RESP 來說,一定要搞清楚協議后,最好能夠手寫協議去執行,再考慮寫程序去實現協議!!!

如何拆解 RESP 協議

終于到了喜聞樂見的環節了,我們要拆解和組裝協議了。那我們至少來解決如下 3 個問題:

該協議是基于 TCP 流的,我們如何判斷整個命令什么時候結束?

如何拆解命令?

協議什么時候結束

一般而言,我們自己在使用 TCP 傳輸數據,都會在數據開頭定義 2 個或者 4 個字節,用于存儲該數據有多少個字節,這樣方便檢驗接收,類似于這種情況。

而 RESP 有意思了,它是以 /r/ n 來分割的。最前面會以前綴來判斷其類型,例如我們發送命令,其會用到的前綴有 * 以及 $,那么我們如何來判斷,我們要讀取多少個 /r/ n 呢?

因為上述 * 代表數組,即有多少組數據需要處理,圖中為 n。

而 $ 表示復雜字符串,即需要獲取 m 個字符數據,不包含 /r/n

如何拆解 RESP 協議

若要拆解命令,則我們得獲取命令,如上圖所示,報文 $m,其實記錄的有 m 長度的數據 (不包含 \r\n),所以我們可以這樣來寫偽代碼。

根據如上,我們很容易寫出偽代碼。

func toArgs(rd *bufio.Reader) {data , _ , _ := rd.ReadLine()
 switch data[0] {
 case  * :
 n := data[1:] //  循環 n 次
 for i:=0;i i++ {toArgs(rd)
 case  $ :
 m := data[1:] //  獲取 m 個數據
 //  獲取 m 長度的數據即可
}

如上我們先獲取前綴為 * 的,繼而獲取其值 n,我們則循環 n 次,即可獲取該報文的數據。而前綴為 $ 的,我們可以直接獲取該 m 長度的數據即可,這里主要要處理一下 \r\n。

將命令構建 RESP 報文規范,根據拆解反操作就可以了,這里暫不介紹了。

上述,我們核心功能已經探討完畢了。

功能實現

代碼已經編寫完畢,放置在了 gitee 上: gitee

如上我們已經學會了如何拆解和組裝 RESP 協議了,我們接著來看,我們如何用 go 來編寫拆解和組裝協議的代碼呢?我們可以看。

我們先創建一個字符,然后將其封裝為 bufio.Reader,我們來看下:

因為我們要使用 readLine() 函數,所以我們需要將其轉換為 bufio.Reader 類型,若是直接從 net.Conn 中獲取,不用轉換,直接可以使用 bufio.Reader 的。

我們將上述偽代碼編寫一下,實現拆解的功能。

其具體執行過程是我們先獲取一行數據,放置到 data 中,而后判斷其前綴是什么,若是 * 則取其后面的數據,將其轉為 int 類型 n,而后再遞歸該函數 n 次,而后中遇到 $,我們則取后面的數據,也是將其轉為 int 類型 m,而后再取 m 長度的實際數據,這就是我們的命令了,最后我們再踢掉命令的 \r\n 即可。

其中,有一個函數是 byteToInt 是我們自己寫的通過切片轉為數字的函數,我們看下

該函數主要的功能是將其 []byte 數字轉換為 int 數據。

如上,我們整個 RESP 協議功能寫完了,我們運行下看下實際效果:

很顯然,我們成功拆解了該數據。

讀到這里,這篇“Redis RESP 協議如何實現”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注丸趣 TV 行業資訊頻道。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-13發表,共計1817字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 辽源市| 宁城县| 金昌市| 普陀区| 贵阳市| 湖口县| 兖州市| 班戈县| 马公市| 阿拉善左旗| 临洮县| 芒康县| 开封县| 长治市| 香格里拉县| 晴隆县| 武隆县| 稷山县| 内丘县| 焦作市| 吴堡县| 金溪县| 梓潼县| 塔城市| 泽州县| 郓城县| 安宁市| 永登县| 普洱| 白沙| 兴安盟| 泰来县| 四子王旗| 巴林左旗| 翼城县| 屏东市| 宁南县| 水城县| 扬州市| 黎城县| 临颍县|