一、命令請求的執行過程
1、發送命令請求
2、讀取命令請求
1)讀取套接字中協議格式的命令請求,並將其保存到客戶端狀態的輸人緩衝區裏面。
2)對輸人緩衝區中的命令請求進行分析,提取出命令請求中包含的命令參數,以及命令參數的個數,然後分別將參數和參數個數保存到客戶端狀態的argv屬性和argc屬性裏面。
3)調用命令執行器,執行客戶端指定的命令。
3、命令執行器(1):查找命令實現
命令執行器要做的第一件事就是根據客戶端狀態的argv[0]參數,在命令表(command table )(命令表是一個字典,字典的鍵是一個個命令名字)中查找參數所指定的命令,並將找到的命令保存到客戶端狀態的cmd屬性裏面。
4、命令執行器(2):執行預備操作——《redis設計與實現》P182
5、命令執行器(3):調用命令的實現函數
6、命令執行器(4):執行後續工作
7、將命令回覆發送給客戶端
8、客戶端接收並打印命令回覆
二、serverCron函數
Redis服務器中的serverCron函數默認每隔100毫秒執行一次,這個函數負責管理服務器的資源,並保持服務器自身的良好運轉。
更新服務器時間緩存
更新LRU時鐘
更新服務器每秒執行命令次數
更新服務器內存峯值記錄
處理SIGTERM信號
管理客戶端資源
如果客戶端與服務器之間的連接已經超時(很長一段時間裏客戶端和服務器都沒有互動),那麼程序釋放這個客戶端。
如果客戶端在上一次執行命令請求之後,輸入緩衝區的大小超過了一定的長度,那麼程序會釋放客戶端當前的輸入緩衝區,並重新創建一個默認大小的輸人緩衝區,從而防止客戶端的輸入緩衝區耗費了過多的內存。
管理數據庫資源
執行被延遲的BGREWRITEAOF
在服務器執行BGSAVE命令的期間,如果客戶端向服務器發來BGREWRITEAOF命令,那麼服務器會將BGREWRITEAOF命令的執行時間延遲到BGSAYE命令執行完畢之後。
檢查持久化操作的運行狀態
將AOF緩衝區中的內容寫入AOF文件
關閉異步客戶端
服務器會關閉那些輸出緩衝區大小超出限制的客戶端
增加cronloops計數器的值
服務器狀態的cronloops屬性記錄了serverCron函數執行的次數
三、初始化服務器
初始化服務器狀態結構
設置服務器的運行ID}
設置服務器的默認運行頻率。
設置服務器的默認配置文件路徑。
設置服務器的運行架構。
設置服務器的默認端口號。
設置服務器的默認RDB持久化條件和AOF持久化條件。
初始化服務器的LRU時鐘。
創建命今表。
載入配置選項
載入用戶給定的配置參數和配置文件,並根據用戶設定的配置,對server變量相關屬性的值進行修改。
初始化服務器數據結構
server.clients鏈表,這個鏈表記錄了所有與服務器相連的客戶端的狀態結構,鏈表的每個節點都包含了一個redisClient結構實例。
server.db數組,數組中包含了服務器的所有數據庫。
用於保存頻道訂閱信息的。erver.pubsub_channels字典,以及用於保存模式訂閱信息的。erver.pubsub_patterns鏈表。
用於執行Lua腳本的Lua環境server.lua。
用於保存慢查詢日誌的server.slowlog屬性。
還原數據庫
如果服務器啓用了AOF持久化功能,那麼服務器使用AOF文件來還原數據庫狀態。
如果服務器沒有啓用AOF持久化功能,那麼服務器使用RDB文件來還原數據庫狀態。
狀態執行事件循環