redis(9)——服務器端

一、命令請求的執行過程

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文件來還原數據庫狀態。

狀態執行事件循環

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章