1.高層視角
可首先閱讀《redis設計與實現》中的[url=伺服器與客戶端[/url]
原文已經相當詳細了,可以**結合文章細細品讀。
2. 伺服器啟動過程
1)初始化伺服器全域性狀態。 initserverconfig()
2)sentinel功能初始化 initsentinel()
3)載入配置檔案。 loadserverconfig()
4)建立 daemon 程序。 daemonize()
5)初始化伺服器功能模組。 initserver()
6)列印 ascii logo。 redisasciiart()
6)從aof檔案或者rdb檔案中載入資料。 loaddatafromdisk()
7)開始事件迴圈。 aemain()
8)伺服器關閉,停止事件迴圈。 aedeleteeventloop()
其中第5部分的細節是
初始化 redis 程序的訊號功能。 setupsignalhandlers()
初始化日誌功能。 openlog()
初始化客戶端功能。
初始化共享物件。 createsharedobjects()
初始化事件功能。 aecreateeventloop()
初始化資料庫。
初始化網路連線。 listentoport()
初始化訂閱與發布功能。
初始化各個統計變數。 resetserverstats()
關聯伺服器常規操作(cron job)到時間事件,關聯客戶端應答處理器到檔案事件。 aecreatetimeevent()
如果 aof 功能已開啟,那麼開啟或建立 aof 檔案。
設定記憶體限制。
初始化cluster。 clusterinit()
初始化複製功能有關的指令碼快取。 replicationscriptcacheinit()
初始化 lua 指令碼環境。 scriptinginit()
初始化慢查詢功能。 slowloginit()
初始化後台操作執行緒。 bioinit()
3.命令表
乙個命令用rediscommand 結構表示,rediscommandtable是所有命令的**。
struct rediscommand rediscommandtable = ,
,//......
};struct rediscommand ;
注意rediscommandtable這種帶大括號的初始化方法,
這是c語言裡對struct型別的變數的一種初始化方法——順序初始化。
順序初始化的特點是: 按照成員定義的順序,從前到後逐個初始化。
優點就是可以把一條記錄寫在一行裡,不用乙個個屬性用.(點)的方式來一行行設定了。維護起來比較直觀方便。
然後為了快速定位命令,redis用乙個雜湊表維護了可以執行的所有命令。
populatecommandtable函式用來初始化這張命令表,這個函式在initserverconfig裡被呼叫。
struct redisserver ;
void populatecommandtable(void)
}
4.命令列
redis用了乙個自己寫的命令列類庫linenoise,只有1千行**,但功能可謂強大,支援許多錦上添花的功能:
歷史記錄功能,按上下鍵可以檢視自己輸過的命令
自動補全功能,按tab鍵可以自動補全命令
多種顏色顯示,比如輸入help get幫助資訊是彩色的
但是貌似沒有複製貼上功能?
其他類似的類庫
[table]
|名稱|**行數|使用它的軟體|
|[url=萬行|bash,mysql,mutt|
|[url=萬行||
|[url=千行|redis,mongodb,android|
|[url=
[/table]
redis原始碼閱讀筆記
在redis中乙個資料庫結構體是這樣的 每個dict是乙個hash表 typedef struct redisdb redisdb dict欄位中存放以key值為鍵,以value指標為值的hash表項dict根據型別的不同分為如下幾種 1 字串 string 操作 set key value get...
InfluxDB原始碼閱讀之httpd服務
作業系統 centos7.3.1611 x64 go語言版本 1.8.3 linux amd64 influxdb版本 1.1.0 原始碼路徑 github.com influxdata influxdb services httpd config test.go 配置測試 service.go h...
Redis學習筆記 原始碼閱讀 整數集合
整數集合 intset 是乙個有序的 儲存整型資料的結構,當redis集合型別的元素都是整數並且都處在64位有符號整數範圍之內時,使用該結構體儲存。在兩種情況下,底層編碼會發生轉換。整數集合在redis中可以儲存int16 t int32 t int64 t型別的整型資料,並且可以保證集合中不會出現...