成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

用Go實現(xiàn)Redis之一準(zhǔn)備工作

zhangke3016 / 847人閱讀

摘要:命令實現(xiàn)命令是最常用的命令之一,也是最能反映緩存發(fā)展歷史的操作。命令在客戶端接收之后,經(jīng)由協(xié)議轉(zhuǎn)換傳遞給服務(wù)端執(zhí)行。服務(wù)端執(zhí)行命令前先查詢是否支持該命令,以決定是否執(zhí)行。,是的簡稱,代表的是只存增量的持久化方式。

緣起

最近公司的第一個PHP轉(zhuǎn)GO項目已經(jīng)在生產(chǎn)環(huán)境穩(wěn)定運(yùn)行數(shù)周,又逢需求小年兒,最近可以得空分享下去年學(xué)GO過程中的練手項目Godis——用Golang實現(xiàn)的Redis.

Redis3.0版本,代碼簡明精煉,再加上是Web后端程序員使用最多組件之一,熟悉Redis原理并閱讀多源碼的開發(fā)者人數(shù)頗多,這個系列小文便不再對Redis細(xì)節(jié)做過多介紹。不過,有必要系統(tǒng)性說明的地方仍然會以較大篇幅嘗試解讀。

進(jìn)入正題 基本流程

Godis第一版的目標(biāo)是“最基本的kv緩存”,feature list如下:

客戶端/服務(wù)端交互

set/get 命令實現(xiàn)

AOF持久化實現(xiàn)

已經(jīng)做到,再精簡就等于沒寫的境界。遵循實際工作中的編碼流程,先設(shè)計基本架構(gòu)再填充實現(xiàn)的方式,Godis的架構(gòu)圖一步到位、毫無點綴:

原理分析 1. 客戶端/服務(wù)端交互

客戶端與服務(wù)端通過建立網(wǎng)絡(luò)連接,發(fā)送、處理、返回數(shù)據(jù)給對方,完成通信。Redis的單機(jī)應(yīng)用中,一個服務(wù)端redis-server進(jìn)程可以處理多個客戶端的請求。

客戶端需要一個數(shù)據(jù)結(jié)構(gòu)來保存信息,接收命令,維持和服務(wù)端的連接,與服務(wù)端進(jìn)行一對一的交互。
客戶端具體需要哪些信息,暫且不表。

服務(wù)端為了響應(yīng)多個客戶端的請求,對數(shù)據(jù)進(jìn)行查詢、存儲、更新、刪除操作,也需要一個結(jié)構(gòu)來保存基本信息,包括數(shù)據(jù)本身、正在連接中的客戶端等。
客戶端和服務(wù)端通過這兩個基本數(shù)據(jù)結(jié)構(gòu),便可以在建立連接(可以簡化為socket demo)之后,保存自身和對方的必要信息,維持之后的交互。

從原理分析入手,使用下圖所示的結(jié)構(gòu)體,可以滿足存儲客戶端、服務(wù)端的數(shù)據(jù)存儲要求:

client并非是我們用來和redis-server交互的client,而是與redis-server建立連接后,服務(wù)端在服務(wù)器創(chuàng)建的、用來存儲當(dāng)前連接的結(jié)構(gòu)。與redis-server建立連接的客戶端什么樣,redis-server不關(guān)心,畢竟與之交互的都是協(xié)議而已。

由圖,client和server結(jié)構(gòu)體均有Db字段,不同的是,server.Db指向的是0號db(Redis支持多db,可以自行查閱了解);client.Db指向的是正在連接的db。如果有select切換操作,該指向也會隨之變化。

2. set/get 命令實現(xiàn)

set、get 命令是redis最常用的命令之一,也是最能反映緩存發(fā)展歷史的操作。對最簡單命令代碼的閱讀,可以看到Redis最核心的原理。
set命令將數(shù)據(jù)以k-v鍵值對,保存到數(shù)據(jù)庫,也就是redis-server占用的內(nèi)存中,并且任何連接到此Redis服務(wù)器的客戶端,都可以通過get命令查詢到。
上一小節(jié)提到,保存服務(wù)器相關(guān)的信息需要一個結(jié)構(gòu)體,這里set命令保存的數(shù)據(jù),也存在這個結(jié)構(gòu)體中。不過,存儲的是數(shù)據(jù)的指針。
所以,set/get的實現(xiàn)原理可以簡化為,在服務(wù)器數(shù)據(jù)結(jié)構(gòu)中保存set命令的數(shù)據(jù),get命令執(zhí)行時,也從這個數(shù)據(jù)結(jié)構(gòu)中查找。
set、get命令在客戶端接收之后,經(jīng)由協(xié)議轉(zhuǎn)換傳遞給服務(wù)端執(zhí)行。服務(wù)端執(zhí)行命令前先查詢是否支持該命令,以決定是否執(zhí)行。所以server結(jié)構(gòu)體還需要有個commands字段,記錄支持的命令列表。

3. AOF持久化實現(xiàn)

set命令保存的數(shù)據(jù)不能一直在內(nèi)存中,萬一宕機(jī)或者硬件故障,數(shù)據(jù)豈不是煙消云散?
這就需要持久化技術(shù),這也是存儲領(lǐng)域的一大關(guān)鍵技術(shù)。AOF,是Append Only File的簡稱,代表的是“只存增量”的持久化方式。在Godis v1.0版本中,將以最簡單的方式實現(xiàn)AOF持久化,做到下次開機(jī)可以查到上次set的數(shù)據(jù) :)
持久化不應(yīng)該對所有命令一視同仁,減少沒必要的執(zhí)行開銷。在server中增加dirty字段,標(biāo)記數(shù)據(jù)是否已經(jīng)被污染,再決定是否持久化。

數(shù)據(jù)結(jié)構(gòu)關(guān)聯(lián)

經(jīng)過如上說明,這里還有一幅Godis v1.0版數(shù)據(jù)結(jié)構(gòu)圖:

下集預(yù)告

完成服務(wù)端/客戶端交互

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/28767.html

相關(guān)文章

  • Go實現(xiàn)Redis之二客戶端/服務(wù)端交互

    摘要:寫在前面在前一篇梳理了版本的基本功能,這一篇要做的是實現(xiàn)客戶端服務(wù)端的交互。進(jìn)入正題事件處理器既要實現(xiàn)交互,網(wǎng)絡(luò)編程必不可少。 寫在前面 在前一篇梳理了Godis v1.0版本的基本功能,這一篇要做的是實現(xiàn)客戶端/服務(wù)端的交互。先讓代碼跑起來,才算有了生命力。本篇Godis版本號:v0.0.1 在這個系列文章里,盡量減少介紹Golang語法、C語言語法和redis原理,聚焦在用Gol...

    Scliang 評論0 收藏0
  • Go實現(xiàn)Redis之三get/set命令實現(xiàn)

    摘要:在讀者閱讀實現(xiàn)代碼時,也可以看到最新版本,與有一處是在文件清除掉回車換行符該行被暫時注釋掉,也就是在版本,使用作為文本協(xié)議分隔符,確定命令的結(jié)尾。 寫在前面 本篇Godis版本號:v0.0.2 前一篇文章實現(xiàn)了客戶端/服務(wù)端的交互。這一篇,主要介紹get/set命令的實現(xiàn)。命令本身比較簡單,支撐命令的整個系統(tǒng)基礎(chǔ)比較麻煩。本文會介紹get/set操作涉及的組件和模塊,并適當(dāng)簡化,最后實...

    Ethan815 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<