国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

用Go實現Redis之一準備工作

zhangke3016 / 845人閱讀

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

緣起

最近公司的第一個PHP轉GO項目已經在生產環境穩定運行數周,又逢需求小年兒,最近可以得空分享下去年學GO過程中的練手項目Godis——用Golang實現的Redis.

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

進入正題 基本流程

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

客戶端/服務端交互

set/get 命令實現

AOF持久化實現

已經做到,再精簡就等于沒寫的境界。遵循實際工作中的編碼流程,先設計基本架構再填充實現的方式,Godis的架構圖一步到位、毫無點綴:

原理分析 1. 客戶端/服務端交互

客戶端與服務端通過建立網絡連接,發送、處理、返回數據給對方,完成通信。Redis的單機應用中,一個服務端redis-server進程可以處理多個客戶端的請求。

客戶端需要一個數據結構來保存信息,接收命令,維持和服務端的連接,與服務端進行一對一的交互。
客戶端具體需要哪些信息,暫且不表。

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

從原理分析入手,使用下圖所示的結構體,可以滿足存儲客戶端、服務端的數據存儲要求:

client并非是我們用來和redis-server交互的client,而是與redis-server建立連接后,服務端在服務器創建的、用來存儲當前連接的結構。與redis-server建立連接的客戶端什么樣,redis-server不關心,畢竟與之交互的都是協議而已。

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

2. set/get 命令實現

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

3. AOF持久化實現

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

數據結構關聯

經過如上說明,這里還有一幅Godis v1.0版數據結構圖:

下集預告

完成服務端/客戶端交互

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/28767.html

相關文章

  • Go實現Redis之二客戶端/服務端交互

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

    Scliang 評論0 收藏0
  • Go實現Redis之三get/set命令實現

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

    Ethan815 評論0 收藏0

發表評論

0條評論

zhangke3016

|高級講師

TA的文章

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