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

go實現(xiàn)Redis讀寫分離示例詳解

 更新時間:2022年08月31日 09:10:45   作者:pdudo  
本篇文章將介紹Redis通信協(xié)議RESP,?而后在使用go來編寫一個中間件,從而來完成Redis讀寫分離,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

我們?yōu)槭裁葱枰私釸ESP協(xié)議?

本篇文章目的為探究RESP協(xié)議,而非編寫讀寫中間件,這點(diǎn)要清楚。

關(guān)于這個問題,我想通過一個實例來解釋,我們編寫Redis中間件,為什么需要了解RESP協(xié)議。

以上代碼是編寫了一個非常簡單的TCP服務(wù)器,我們監(jiān)聽8888端口,嘗試使用redis-cli -p 8888連接服務(wù)器后,而后查看打印出來的應(yīng)用層報文。

我們嘗試執(zhí)行下該代碼,并且輸入redis-cli -p 8888進(jìn)行連接。

我們編寫的服務(wù)器獲取redis客戶端的報文為:

*1
$7
COMMAND

上面這個就是RESP協(xié)議的內(nèi)容了,所以說,我們要編寫一個Redis的中間件,我們需要先了解一下RESP協(xié)議才行。

什么是RESP協(xié)議

官網(wǎng)有相關(guān)的解釋: https://redis.io/docs/reference/protocol-spec/

RESP協(xié)議創(chuàng)建之初是專門為了Redis服務(wù)器和客戶端的通信而設(shè)計的,該協(xié)議在Redis 1.2中引入,并且在Redis 2.0中,成為Redis通信的標(biāo)準(zhǔn)協(xié)議。該協(xié)議有如下優(yōu)點(diǎn):

  • 實現(xiàn)簡單
  • 快速解析
  • 直接可閱讀

RESP根據(jù)其協(xié)議前綴,可以序列化不同的數(shù)據(jù)類型,例如: 整數(shù)、字符串、數(shù)組 等,還能標(biāo)注 正常輸出 和 錯誤輸出等。除了流水線和發(fā)布訂閱以外,RESP協(xié)議應(yīng)該是最簡單的請求-響應(yīng)協(xié)議了。關(guān)于更多介紹,大佬們可以看看上面注釋的官方文檔。

RESP協(xié)議規(guī)范

RESP協(xié)議不同的部分使用\r\n(換行符)來進(jìn)行分割,其支持5種數(shù)據(jù)類型,分別為: 簡單字符串、錯誤、整數(shù)、復(fù)雜字符串 和 數(shù)組組成,我們列個表格來講下。

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

我當(dāng)初看到這個的時候,也是迷迷糊糊的,到底什么意思呢? 哎,我們舉個例子你就明白了。

若我們想執(zhí)行

set juejinName pdudo

若使用RESP 協(xié)議應(yīng)當(dāng)如何編寫呢?應(yīng)當(dāng)編寫如下:

*3
$3
set
$10
juejinName
$5
pdudo

那我們來解釋一下*3代表有3個數(shù)組,而$3代表復(fù)雜字符串有長度為3,值為set, $10代表復(fù)雜字符串長度為10,值為juejinName, $5代表復(fù)雜字符串長度為5,值為pdudo。

我們結(jié)合上述信息,可以畫一張圖。

這就是協(xié)議的內(nèi)容了。

而協(xié)議前綴+、-、:則要簡單的多,直接跟數(shù)據(jù)即可,

例如:

+

+OK

-

-ERR syntax error

:

:3

如何使用該協(xié)議請求Redis

我們已經(jīng)學(xué)習(xí)了相關(guān)的RESP協(xié)議,那么我們?nèi)绾螌W(xué)習(xí)呢? 我們可以使用telnet命令來操作即可。

在此,我們準(zhǔn)備幾條命令,我們會將其轉(zhuǎn)換為RESP格式,且將其發(fā)送到redis服務(wù)器。

命令

set name pdudo
get name
lpush pn 1
llen pn

轉(zhuǎn)換為RESP格式

*3
$3
set
$4
name
$5
pdudo
*2
$3
get
$4
name
*3
$5
lpush
$2
pn
$1
1
*2
$4
llen
$2
pn

我們將其放置到telnet中執(zhí)行一下呢

現(xiàn)在回頭看看官網(wǎng)文檔所提及的,該協(xié)議實現(xiàn)簡單,直接可閱讀,是不是理解的更加深刻了呢?

使用go編寫Redis中間件實現(xiàn)讀寫分離

本篇暫不解釋代碼,而后單獨(dú)開一篇談?wù)撝虚g件代碼。

實現(xiàn)該功能,其實本質(zhì)上是區(qū)分命令是查詢還是寫入,若是查詢,則直接轉(zhuǎn)發(fā)到從庫,而寫入,則轉(zhuǎn)發(fā)到主庫即可,其架構(gòu)圖可以理解為如下:

我們已經(jīng)有了目前的架構(gòu)。

主機(jī)端口密碼角色
127.0.0.16379主庫
127.0.0.17380從庫

相關(guān)代碼已經(jīng)放到了 gitee.com/pdudo/golea…

我們來看看實際效果呢:

總結(jié)

其實本篇文章核心的點(diǎn)是探究RESP協(xié)議,而我們使用go編寫了一個軟件,用于解析RESP協(xié)議,從而獲取執(zhí)行的命令,再根據(jù)命令屬性,從而轉(zhuǎn)發(fā)從庫或者主庫,以此來達(dá)到讀寫分離的效果。再次提及一下核心點(diǎn)是拆解RESP協(xié)議。

怎么樣,好玩吧,動動你的小手指,快來試試吧。

以上就是go實現(xiàn)Redis讀寫分離示例詳解的詳細(xì)內(nèi)容,更多關(guān)于go Redis讀寫分離的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • go-zero自定義中間件的幾種方式

    go-zero自定義中間件的幾種方式

    首先 go-zero 已經(jīng)為我們提供了很多的中間件的實現(xiàn),但有時難免有需求需要自定義,這里介紹幾種自定義的方法,文中通過代碼示例講解的非常詳細(xì),具有一定的參考價值,需要的朋友可以參考下
    2024-07-07
  • Golang命令行進(jìn)行debug調(diào)試操作

    Golang命令行進(jìn)行debug調(diào)試操作

    今天小編就為大家分享一篇關(guān)于,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • golang1.16新特性速覽(推薦)

    golang1.16新特性速覽(推薦)

    這篇文章主要介紹了golang1.16新特性速覽,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • goland設(shè)置控制臺折疊效果

    goland設(shè)置控制臺折疊效果

    這篇文章主要介紹了goland設(shè)置控制臺折疊效果,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • 利用Go語言開發(fā)文件操作工具輕松處理所有文件

    利用Go語言開發(fā)文件操作工具輕松處理所有文件

    在后端開發(fā)中,文件操作是一個非常常見但又容易出錯的場景,本文小編要向大家介紹一個強(qiáng)大的 Go 語言文件操作工具庫,它能幫你輕松處理各種文件操作場景
    2025-03-03
  • golang如何使用struct的tag屬性的詳細(xì)介紹

    golang如何使用struct的tag屬性的詳細(xì)介紹

    這篇文章主要介紹了golang如何使用struct的tag屬性的詳細(xì)介紹,從例子說起,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • Golang實現(xiàn)JWT身份驗證的示例詳解

    Golang實現(xiàn)JWT身份驗證的示例詳解

    JWT(JSON Web Token)是一種開放標(biāo)準(zhǔn)(RFC 7519),用于在網(wǎng)絡(luò)應(yīng)用間安全地傳輸聲明,本文主要為大家詳細(xì)介紹了Golang實現(xiàn)JWT身份驗證的相關(guān)方法,希望對大家有所幫助
    2024-03-03
  • 淺談golang的json.Unmarshal的坑

    淺談golang的json.Unmarshal的坑

    本文主要介紹了淺談golang的json.Unmarshal的坑,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • 利用golang和shell計算一個字符串的md5值

    利用golang和shell計算一個字符串的md5值

    這篇文章主要介紹了如何利用golang和shell計算一個字符串的md5值,我們先用shell來計算一下,再去判斷golang計算的md5值是否正確,文中有詳細(xì)的圖文介紹,需要的朋友可以參考下
    2024-03-03
  • 一文教你Golang如何正確關(guān)閉通道

    一文教你Golang如何正確關(guān)閉通道

    Go在通道這一塊,沒有內(nèi)置函數(shù)判斷通道是否已經(jīng)關(guān)閉,也沒有可以直接獲取當(dāng)前通道數(shù)量的方法,因此如果對通道進(jìn)行了錯誤的使用,將會直接引發(fā)系統(tǒng)?panic,這是一件很危險的事情,下面我們就來學(xué)習(xí)一下如何正確關(guān)閉通道吧
    2023-10-10

最新評論

桐庐县| 会同县| 鄂州市| 丰台区| 绍兴市| 古浪县| 海安县| 元氏县| 清苑县| 麻江县| 新干县| 宿松县| 犍为县| 中卫市| 邯郸县| 屯昌县| 大邑县| 奈曼旗| 通化市| 柘荣县| 福泉市| 木兰县| 伊宁市| 和田市| 监利县| 邯郸市| 长海县| 南投县| 章丘市| 龙川县| 临江市| 山阴县| 内黄县| 盐源县| 萨嘎县| 长宁县| 浙江省| 博湖县| 九龙县| 嘉义县| 临高县|