亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Redis?RESP?協(xié)議實現(xiàn)實例詳解

 更新時間:2022年09月01日 14:39:28   作者:pdudo  
這篇文章主要為大家介紹了Redis?RESP?協(xié)議實現(xiàn)實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

我們之前已經(jīng)學(xué)習(xí)了RESP協(xié)議的內(nèi)容,且已經(jīng)完成了一個最簡單的Redis讀寫分離中間件,我們來看拆解下該demo, 看看Redis RESP協(xié)議實現(xiàn)起來到底有多簡單。

回顧RESP協(xié)議

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

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

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

*3
$3
set
$4
name
$5
pdudo

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

我們準(zhǔn)備2個例子,我們來敲一下

例子1

set name pdudo

例子2

lpush pdudo data1
lpush pdudo data2
lrange pdudo 0 -1

快來動動你的小手指,看能不能根據(jù)RESP協(xié)議規(guī)則,將上述例子命令敲出來?,F(xiàn)在你體會到了Redis官網(wǎng)介紹RESP協(xié)議時所述的 簡單易讀 可么?

帶著來敲一下

對于RESP來說,一定要搞清楚協(xié)議后,最好能夠手寫協(xié)議去執(zhí)行,再考慮寫程序去實現(xiàn)協(xié)議?。?!

如何拆解RESP協(xié)議

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

  • 該協(xié)議是基于TCP流的,我們?nèi)绾闻袛嗾麄€命令什么時候結(jié)束?
  • 如何拆解命令?

協(xié)議什么時候結(jié)束

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

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

因為上述*代表數(shù)組,即有多少組數(shù)據(jù)需要處理,圖中為n

$表示復(fù)雜字符串,即需要獲取m個字符數(shù)據(jù),不包含/r/n

如何拆解RESP協(xié)議

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

根據(jù)如上,我們很容易寫出偽代碼

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

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

將命令構(gòu)建RESP報文規(guī)范,根據(jù)拆解反操作就可以了,這里暫不介紹了。

上述,我們核心功能已經(jīng)探討完畢了。

功能實現(xiàn)

代碼已經(jīng)編寫完畢,放置在了gitee上: gitee

如上我們已經(jīng)學(xué)會了如何拆解和組裝RESP協(xié)議了,我們接著來看,我們?nèi)绾斡?code>go來編寫拆解和組裝協(xié)議的代碼呢? 我們可以看。

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

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

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

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

其中,有一個函數(shù)是byteToInt是我們自己寫的通過切片轉(zhuǎn)為數(shù)字的函數(shù),我們看下

該函數(shù)主要的功能是將其[]byte數(shù)字轉(zhuǎn)換為int數(shù)據(jù)。

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

很顯然,我們成功拆解了該數(shù)據(jù)。

總結(jié)

這篇文章,我們介紹了應(yīng)該如何使用go簡單的拆解RESP協(xié)議的內(nèi)容,為什么我們不介紹如何編寫redis主從中間件呢?

最開始是打算這樣寫的,但是知識多了,介紹起來會很雜,很難把一個點講清楚,所以我們就單獨挑了一個核心點來介紹,我愿意將其稱之為面向核心編程(我的基友很早之前告訴我的),所謂的面向核心編程簡而易在就是我們在涉及一個功能的時候,要學(xué)會拆解該功能,將核心功能先用demo做出來,而后再慢慢豐富周邊,從而完成整個需求涉及。

最后我們再來聊聊RESP協(xié)議,官網(wǎng)在介紹時將其概括為實現(xiàn)簡單、快速解析、直接可閱讀。如果你認(rèn)真學(xué)習(xí)這2篇文章,肯定對此深有感悟。

更多關(guān)于Redis RESP 協(xié)議的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Redis底層數(shù)據(jù)結(jié)構(gòu)之dict、ziplist、quicklist詳解

    Redis底層數(shù)據(jù)結(jié)構(gòu)之dict、ziplist、quicklist詳解

    本文給大家詳細(xì)介紹了Redis的底層數(shù)據(jù)結(jié)構(gòu):dict、ziplist、quicklist的相關(guān)知識,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-09-09
  • redis中的數(shù)據(jù)結(jié)構(gòu)和編碼詳解

    redis中的數(shù)據(jù)結(jié)構(gòu)和編碼詳解

    本文主要和大家分享幾種Redis數(shù)據(jù)結(jié)構(gòu)詳解,希望文中的案例和代碼,能幫助到大家。
    2020-03-03
  • Redis的過期鍵刪除策略原理說明

    Redis的過期鍵刪除策略原理說明

    這篇文章主要介紹了Redis的過期鍵刪除策略原理說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Redis實現(xiàn)附近商鋪的項目實戰(zhàn)

    Redis實現(xiàn)附近商鋪的項目實戰(zhàn)

    本文主要介紹了Redis實現(xiàn)附近商鋪的項目實戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • Windows下Redis安裝配置教程

    Windows下Redis安裝配置教程

    這篇文章主要為大家詳細(xì)介紹了Windows下Redis安裝配置教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Linux安裝單機(jī)版Redis的完整步驟

    Linux安裝單機(jī)版Redis的完整步驟

    這篇文章主要給大家介紹了關(guān)于Linux安裝單機(jī)版Redis的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • Springboot/Springcloud項目集成redis進(jìn)行存取的過程解析

    Springboot/Springcloud項目集成redis進(jìn)行存取的過程解析

    大家都知道Redis支持五種數(shù)據(jù)類型:string(字符串),hash(哈希),list(列表),set(集合),zset(sorted set:有序集合),本文重點給大家介紹Springboot/Springcloud項目集成redis進(jìn)行存取的過程,需要的朋友參考下吧
    2021-12-12
  • Redis筆記點贊排行榜的實現(xiàn)示例

    Redis筆記點贊排行榜的實現(xiàn)示例

    探店筆記類似點評網(wǎng)站的評價,本文主要介紹了Redis筆記點贊排行榜的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • Redis GEO地理信息定位功能

    Redis GEO地理信息定位功能

    Redis 提供了GEO地理信息定位功能,地理空間項(經(jīng)度、緯度、名稱),實現(xiàn)查找附近的人、上班打卡、自行車租賃、搖一搖等相關(guān)與地理位置信息的功能,這篇文章主要介紹了Redis GEO地理信息定位功能,需要的朋友可以參考下
    2023-12-12
  • windows環(huán)境下Redis+Spring緩存實例講解

    windows環(huán)境下Redis+Spring緩存實例講解

    這篇文章主要為大家詳細(xì)介紹了windows環(huán)境下Redis+Spring緩存實例教程,感興趣的小伙伴們可以參考一下
    2016-04-04

最新評論