91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Redis?RESP協議如何實現

發布時間:2022-09-07 10:07:15 來源:億速云 閱讀:120 作者:iii 欄目:關系型數據庫

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

回顧RESP協議

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

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

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

*3
$3
set
$4
name
$5
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個字節,用于存儲該數據有多少個字節,這樣方便檢驗接收,類似于這種情況。

Redis?RESP協議如何實現

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

Redis?RESP協議如何實現

因為上述*代表數組,即有多少組數據需要處理,圖中為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<n;i++ {
			toArgs(rd)
		}
	case '$':
		m := data[1:] // 獲取m個數據
		// 獲取m長度的數據即可
	}
}

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

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

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

功能實現

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

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

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

Redis?RESP協議如何實現

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

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

Redis?RESP協議如何實現

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

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

Redis?RESP協議如何實現

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

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

Redis?RESP協議如何實現

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

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永福县| 宁城县| 霍林郭勒市| 二连浩特市| 邛崃市| 枝江市| 巴彦淖尔市| 罗平县| 威海市| 蒲城县| 东乌珠穆沁旗| 赣榆县| 伊吾县| 日照市| 合阳县| 论坛| 双鸭山市| 金堂县| 永宁县| 克拉玛依市| 新建县| 衡东县| 郸城县| 遂溪县| 尉氏县| 枞阳县| 军事| 延安市| 桂阳县| 庐江县| 新疆| 洪江市| 汾阳市| 遂昌县| 富平县| 临颍县| 诸暨市| 广安市| 鄂温| 普陀区| 龙岩市|