欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

go實現Redis讀寫分離示例詳解

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

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

本篇文章目的為探究RESP協議,而非編寫讀寫中間件,這點要清楚。

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

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

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

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

*1
$7
COMMAND

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

什么是RESP協議

官網有相關的解釋: https://redis.io/docs/reference/protocol-spec/

RESP協議創(chuàng)建之初是專門為了Redis服務器和客戶端的通信而設計的,該協議在Redis 1.2中引入,并且在Redis 2.0中,成為Redis通信的標準協議。該協議有如下優(yōu)點:

  • 實現簡單
  • 快速解析
  • 直接可閱讀

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

RESP協議規(guī)范

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

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

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

若我們想執(zhí)行

set juejinName pdudo

若使用RESP 協議應當如何編寫呢?應當編寫如下:

*3
$3
set
$10
juejinName
$5
pdudo

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

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

這就是協議的內容了。

而協議前綴+、-、:則要簡單的多,直接跟數據即可,

例如:

+

+OK

-

-ERR syntax error

:

:3

如何使用該協議請求Redis

我們已經學習了相關的RESP協議,那么我們如何學習呢? 我們可以使用telnet命令來操作即可。

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

命令

set name pdudo
get name
lpush pn 1
llen pn

轉換為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í)行一下呢

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

使用go編寫Redis中間件實現讀寫分離

本篇暫不解釋代碼,而后單獨開一篇談論中間件代碼。

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

我們已經有了目前的架構。

主機端口密碼角色
127.0.0.16379主庫
127.0.0.17380從庫

相關代碼已經放到了 gitee.com/pdudo/golea…

我們來看看實際效果呢:

總結

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

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

以上就是go實現Redis讀寫分離示例詳解的詳細內容,更多關于go Redis讀寫分離的資料請關注腳本之家其它相關文章!

相關文章

  • 詳解prometheus監(jiān)控golang服務實踐記錄

    詳解prometheus監(jiān)控golang服務實踐記錄

    這篇文章主要介紹了詳解prometheus監(jiān)控golang服務實踐記錄,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • Apache?IoTDB開發(fā)系統之Go原生接口方法

    Apache?IoTDB開發(fā)系統之Go原生接口方法

    這篇文章主要為大家介紹了?Apache?IoTDB開發(fā)系統之Go原生接口方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • Go語言簡介和環(huán)境配置

    Go語言簡介和環(huán)境配置

    Go語言保證了既能到達靜態(tài)編譯語言的安全和性能,又達到了動態(tài)語言開發(fā)速度和易維護性,有人形容Go語言:Go=?C?+?Python?,?說明Go語言既有C靜態(tài)語言程序的運行速度,又能達到Python動態(tài)語言的快速開發(fā),這篇文章主要介紹了Go介紹和環(huán)境配置,需要的朋友可以參考下
    2022-07-07
  • golang中import cycle not allowed解決的一種思路

    golang中import cycle not allowed解決的一種思路

    這篇文章主要給大家介紹了關于golang中import cycle not allowed解決的一種思路,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧
    2018-08-08
  • Go語言中的變量和常量

    Go語言中的變量和常量

    這篇文章介紹了Go語言中的變量和常量,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • Go語言接口用法實例

    Go語言接口用法實例

    這篇文章主要介紹了Go語言接口用法,實例分析了Go語言接口的功能、定義及使用技巧,需要的朋友可以參考下
    2015-02-02
  • 使用Go語言實現遠程傳輸文件

    使用Go語言實現遠程傳輸文件

    本文主要介紹如何利用Go語言實現遠程傳輸文件的功能,有需要的小伙伴們可以參考學習。下面跟著小編一起來學習學習。
    2016-08-08
  • Go語言特點及基本數據類型使用詳解

    Go語言特點及基本數據類型使用詳解

    這篇文章主要為大家介紹了Go語言特點及基本數據類型使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-03-03
  • golang http連接復用方法

    golang http連接復用方法

    今天小編就為大家分享一篇golang http連接復用方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Golang Mutex實現互斥的具體方法

    Golang Mutex實現互斥的具體方法

    Mutex是Golang常見的并發(fā)原語,在開發(fā)過程中經常使用到,本文主要介紹了Golang Mutex實現互斥的具體方法,具有一定的參考價值,感興趣的可以了解一下
    2023-04-04

最新評論