Redis命令請求的執行過程:
1.發送命令請求
客戶端將命令請求轉換成協議格式,通過連接到服務器的套接字發送給服務器。
2.讀取命令請求
1)讀取套接字協議格式的請求,保存到客戶端狀態的緩衝輸入區。
2)分析緩衝區命令,提取命令參數及個數,分別保存到客戶端狀態的argv屬性和argc屬性。
3)調用命令執行器。
3.命令執行器
1)查找實現命令:根據客戶端狀態的argv[0]參數,查找參數指定的命令,保存到客戶端狀態的cmd屬性。
2)執行預備操作:檢查客戶端cmd屬性指向、參數個數、身份驗證是否合法等等一系列服務器和客戶端狀態的校驗。
3)調用命令的實現函數:函數調用產生setCommand(client)將產生一個 "+OK\r\n" 回覆,保存到客戶端的buf屬性。
4)執行後續工作:根據配置執行相應操作,例如慢查詢日誌、AOF持久化、主從服務。
4.將命令回覆發送給客戶端:將協議格式的命令回覆 +“OK\r\n”發送給客戶端。
5.客戶端接收並打印命令回覆:將協議回覆的 “OK\r\n” 轉換成 “OK\n” 打印給用戶。
Redis服務器中serverCron函數每隔100ms執行一次,該函數負責管理服務器資源並保持服務器良好運轉。
- 更新服務器時間緩存
- 更新LRU時鐘
- 更新服務器每秒執行命令次數
- 更新服務器內存峯值記錄
- 處理SIGTERM信號
- 管理客戶端資源
- 管理數據庫資源
- 執行被延遲的BGREWRITEAOF
- 檢查持久化操作的運行狀態
- 將AOP緩衝區內容寫入AOF文件
- 關閉異步客戶端
- 增加cronloops計數器的值