1. 程式人生 > 其它 >《Redis設計與實現》讀書筆記(二十三) ——Redis伺服器初始化

《Redis設計與實現》讀書筆記(二十三) ——Redis伺服器初始化

《Redis設計與實現》讀書筆記(二十三) ——Redis伺服器初始化

(原創內容,轉載請註明來源,謝謝)

redis伺服器開啟時,會先進行初始化,主要有五個步驟,如下:

1、初始化狀態結構

首先,會建立一個structredisServer例項變數,儲存伺服器的狀態。

接著,redis初始化伺服器,會執行一次redis.c/initServerConfig函式,主要工作是設定伺服器執行ID、預設執行頻率、預設配置檔案路徑、執行架構、預設埠號、RDB條件、AOF條件、LRU時鐘、建立命令表。

初始化狀態結構,都是簡單的結構,後續的資料庫、共享物件、慢查詢日誌、Lua環境等,都是後面才建立的。

2、載入配置選項

在啟動redis伺服器時,可以通過引數指定配置檔案、埠號等。redis會載入這些配置,並且和預設不同的時候,會覆蓋預設的配置。

例如輸入redis-server –port5000,則會先建立埠基於6379的,再在這一步修改埠號為5000。

在載入使用者配置的檔案,如果有定義新的結果,則使用新結果,否則就使用預設值。

3、初始化伺服器資料結構

1)建立資料結構

在第一步,只建立了一個命令表,在此步驟則會建立其他資料結構,

包括:

server.client    //連結串列,用於儲存普通客戶端,每個節點是一個redisClient結構;
server.db        //連結串列,儲存所有的資料庫;
server.pubsub_channels//連結串列,儲存頻道訂閱資訊;server.pubsub_patterns連結串列,儲存模式訂閱資訊。
server.lua       //用於執行lua指令碼的環境。
server.showlog   //用於儲存慢查詢。

伺服器會為上述結構分配記憶體空間。在此步驟才建立資料結構,是因為如果第一步建立,而第二步載入使用者自定義配置的時候,有可能會修改到某些內容,則還需要重寫。而命令表由於是固定的,因此可以放到第一步建立。

2)其他設定操作

除了建立資料結構,還會進行一些重要的設定。

包括:

為伺服器設定程序訊號處理器。

建立共享物件,包括整數1~10000的字串物件,“OK”、“ERR”回覆的字串物件等,用於避免反覆建立相同物件。

開啟伺服器監聽埠,為監聽的套接字新增相應的應答事件,等待伺服器正式執行時接收客戶端的連線。

為serverCron函式建立時間事件,等待伺服器正式執行serverCron。

如果AOF持久化開啟,則開啟aof檔案,如果不存在則建立aof檔案。

初始化伺服器後臺I/O模組(bio),為將來的I/O做好準備。

4、還原資料庫狀態

如果開啟aof,則載入aof檔案;如果沒有開啟aof,則載入rdb檔案。

載入完成後,在日誌中列印載入的耗時。

5、執行事件迴圈

初始化最後一步,伺服器將列印連線成功的日誌。並且開始事件迴圈,初始化正式完成,可以開始處理客戶端的請求。

redis伺服器相關內容總結:

1、命令請求傳送主要步驟——客戶端命令發給伺服器;伺服器解析命令並存儲在客戶端的結構體相應屬性;伺服器檢查是否具備執行條件,檢查完畢後執行,執行後進行執行後的後續工作;將執行結果回覆客戶端。

2、serverCron函式每100毫秒執行1次,主要更新伺服器狀態、管理客戶端、管理資料庫、執行持久化,保證redis伺服器正常提供服務。

3、伺服器啟動到接收客戶端命令,主要步驟——初始化伺服器狀態;載入使用者自定義配置;建立伺服器用到的資料結構;還原資料庫狀態;執行事件迴圈,開始提供服務。

——written by linhxx 2017.09.09