最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

引言

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

回顧RESP協(xié)議

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

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

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

*3
$3
set
$4
name
$5
pdudo

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

我們準(zhǔn)備2個(gè)例子,我們來(lái)敲一下

例子1

set name pdudo

例子2

lpush pdudo data1
lpush pdudo data2
lrange pdudo 0 -1

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

帶著來(lái)敲一下

對(duì)于RESP來(lái)說(shuō),一定要搞清楚協(xié)議后,最好能夠手寫協(xié)議去執(zhí)行,再考慮寫程序去實(shí)現(xiàn)協(xié)議?。。?/p>

如何拆解RESP協(xié)議

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

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

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

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

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

因?yàn)樯鲜?code>*代表數(shù)組,即有多少組數(shù)據(jù)需要處理,圖中為n。

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

如何拆解RESP協(xié)議

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

根據(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個(gè)數(shù)據(jù)
		// 獲取m長(zhǎng)度的數(shù)據(jù)即可
	}
}

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

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

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

功能實(shí)現(xiàn)

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

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

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

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

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

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

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

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

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

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

總結(jié)

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

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

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

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

相關(guān)文章

  • Linux上安裝Redis詳細(xì)教程

    Linux上安裝Redis詳細(xì)教程

    這篇文章主要給大家詳細(xì)介紹了在Linux上安裝Redis詳細(xì)教程,文中有詳細(xì)的代碼示例和安裝步驟,對(duì)我們學(xué)習(xí)安裝redis有一定的幫助,需要的朋友可以參考下
    2023-07-07
  • Redis的Bitmap(位圖)詳解和命令演示

    Redis的Bitmap(位圖)詳解和命令演示

    Redis的位圖是由多個(gè)二進(jìn)制位組成的數(shù)組,數(shù)組中的每個(gè)二進(jìn)制位都有與之對(duì)應(yīng)的偏移量,用戶通過(guò)這些偏移量可以對(duì)位圖中指定的一個(gè)或多個(gè)二進(jìn)制位進(jìn)行操作,這篇文章主要給大家介紹了關(guān)于Redis的Bitmap(位圖)詳解和命令演示的相關(guān)資料,需要的朋友可以參考下
    2024-08-08
  • Redis內(nèi)存碎片處理實(shí)例詳解

    Redis內(nèi)存碎片處理實(shí)例詳解

    內(nèi)存碎片是redis服務(wù)中分配器分配存儲(chǔ)對(duì)象內(nèi)存的時(shí)產(chǎn)生的,下面這篇文章主要給大家介紹了關(guān)于Redis內(nèi)存碎片處理的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • redis發(fā)布訂閱模式的實(shí)現(xiàn)

    redis發(fā)布訂閱模式的實(shí)現(xiàn)

    本文主要介紹了redis發(fā)布訂閱模式,Redis?的?SUBSCRIBE?命令可以讓客戶端訂閱任意數(shù)量的頻道,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-04-04
  • Redis如何實(shí)現(xiàn)刷票過(guò)濾

    Redis如何實(shí)現(xiàn)刷票過(guò)濾

    這篇文章主要介紹了Redis如何實(shí)現(xiàn)刷票過(guò)濾問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • 使用Jedis線程池returnResource異常注意事項(xiàng)

    使用Jedis線程池returnResource異常注意事項(xiàng)

    這篇文章主要介紹了使用Jedis線程池returnResource異常注意事項(xiàng),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • redis中事務(wù)機(jī)制及樂(lè)觀鎖的實(shí)現(xiàn)

    redis中事務(wù)機(jī)制及樂(lè)觀鎖的實(shí)現(xiàn)

    這篇文章主要介紹了redis中事務(wù)機(jī)制及樂(lè)觀鎖的相關(guān)內(nèi)容,通過(guò)事務(wù)的執(zhí)行分析Redis樂(lè)觀鎖,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10
  • linux服務(wù)器中搭建redis6.0.7集群

    linux服務(wù)器中搭建redis6.0.7集群

    這篇文章主要介紹了linux服務(wù)器中搭建redis6.0.7集群的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Redis的setNX分布式鎖超時(shí)時(shí)間失效 -1問(wèn)題及解決

    Redis的setNX分布式鎖超時(shí)時(shí)間失效 -1問(wèn)題及解決

    這篇文章主要介紹了Redis的setNX分布式鎖超時(shí)時(shí)間失效 -1問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 詳解Redis如何多規(guī)則限流和防重復(fù)提交

    詳解Redis如何多規(guī)則限流和防重復(fù)提交

    市面上很多介紹redis如何實(shí)現(xiàn)限流的,但是大部分都有一個(gè)缺點(diǎn),就是只能實(shí)現(xiàn)單一的限流,但是如果想一個(gè)接口兩種規(guī)則都需要滿足呢,使用本文就來(lái)介紹一下redis實(shí)現(xiàn)分布式多規(guī)則限流的方式吧
    2023-12-12

最新評(píng)論

镇远县| 甘洛县| 新余市| 兰坪| 乌兰县| 新郑市| 沈丘县| 梅河口市| 潞城市| 思南县| 张家口市| 玉溪市| 鄂尔多斯市| 漳平市| 寻甸| 比如县| 泊头市| 淳安县| 汉源县| 蒙自县| 辽源市| 盘山县| 泊头市| 纳雍县| 牙克石市| 罗田县| 炎陵县| 德安县| 凉山| 治多县| 缙云县| 邮箱| 麻阳| 富宁县| 轮台县| 开江县| 临泉县| 尚义县| 安庆市| 上林县| 潜山县|