文章目錄
- 啟動過程
- 初始化server結構體
- main函數會調用initServer函數初始化服務器狀態
- 載入持久化文件,還原數據庫
- 開始監聽事件
- 流程圖
啟動過程
- 初始化server結構體
- 從配置文件夾在加載參數
- 初始化服務器
- 載入持久化文件
- 開始監聽事件
初始化server結構體
- 服務器的運行ID
- redis使用的默認端口號,是在server.h定義的CONFIG_DEFAULT_SERVER_PORT = 6379
- LRU時鐘
- 主從備份相關參數
- 命令表
- 慢查詢參數
- 接著會保存當前執行的路徑和參數,為之后的服務器重啟使用相同的參數做準備:
server.executable = getAbsolutePath(argv[0]); server.exec_argv = zmalloc(sizeof(char*)*(argc+1)); server.exec_argv[argc] = NULL; for (j = 0; j < argc; j++) server.exec_argv[j] = zstrdup(argv[j]);
main函數會調用initServer函數初始化服務器狀態
- 進程ID
- 客戶端鏈表
- 從庫鏈表
- 為常用值創建共享對象
- 初始化事件循環器
- 打開TCP開始監聽套接字
- 創建服務器的數據庫,并初始化內部狀態
- 為serverCron定時器創建時間事件定時器
- 如果開啟了AOF,打開AOF文件,之后恢復數據時需要用到
- 初始化慢查詢日志模塊
- 初始化后臺IO模塊
載入持久化文件,還原數據庫
初始化完服務器的狀態后,服務器已經處于一個可啟動狀態,因為redis有持久化特性,服務器還需要加載相應的文件來還原之前數據庫的數據。 判斷Redis當前開啟了哪種模式,如果是AOF,則通過AOF還原數據庫的數據,否則,載入RDB文件,通過RDB文件還原數據庫的數據。
開始監聽事件
main函數會設置beforeSleep和afterSleep回調函數,然后調用aeMain函數啟動事件循環器,開始監聽事件。aeMain函數是一個死循環,不斷的監聽新請求的到來。
/** server啟動后,main函數的最終步驟,不斷地調用beforesleep和aeProcessEvents*/
void aeMain(aeEventLoop *eventLoop) {eventLoop->stop = 0;while (!eventLoop->stop) {if (eventLoop->beforesleep != NULL)eventLoop->beforesleep(eventLoop);aeProcessEvents(eventLoop, AE_ALL_EVENTS|AE_CALL_AFTER_SLEEP);}
}
流程圖
- 初始化結構體
- 定義變量
- 初始化基本屬性
- 加載配置文件設置屬性
- 初始化服務器
- 初始化數據結構
- 常用共享對象
- 載入持計劃文件,加載數據
- 開始監聽事件