Redis一个命令请求从发送到完成的步骤以及初始化服务器步骤
一個命令請求從發(fā)送到完成的步驟
如下:
1、客戶端將命令請求發(fā)送給服務(wù)器
- 當用戶在客戶端中鍵入一個命令請求時,客戶端會將這個命令請求轉(zhuǎn)換成協(xié)議格式,然后通過連接到服務(wù)器的套接字,將協(xié)議格式的命令請求發(fā)送給服務(wù)器。
2、服務(wù)器讀取命令請求,并分析出命令參數(shù)
- 讀取套接字中協(xié)議格式的命令請求,將其保存到客戶端狀態(tài)的輸入緩沖區(qū)中
- 對輸入緩沖區(qū)中的命令請求進行解析,提取出命令參數(shù)以及命令參數(shù)的個數(shù),保存到客戶端狀態(tài)的argv屬性與argc屬性
- 調(diào)用命令執(zhí)行器,執(zhí)行指定指令
3、命令執(zhí)行器根據(jù)參數(shù)查找命令的實現(xiàn)函數(shù),然后執(zhí)行實現(xiàn)函數(shù)并得到命令回復
- 根據(jù)客戶端狀態(tài)的argv[0]參數(shù),在命令表中查找參數(shù)所指定的命令,并將找到的命令保存到客戶端狀態(tài)的cmd屬性里
- 執(zhí)行預(yù)備操作,確保命令可以正確執(zhí)行(一些檢查操作)
- 將客戶端狀態(tài)指針作為參數(shù)傳入實現(xiàn)函數(shù),進行執(zhí)行
- 執(zhí)行后續(xù)工作
- 若開啟了慢查詢?nèi)罩竟δ?#xff0c;模塊會檢查是否需要給剛剛執(zhí)行完的命令添加一條慢查詢?nèi)罩?/li>
- 若開啟了AOF持久化,模塊會將剛剛執(zhí)行的命令請求寫入到AOF緩沖區(qū)中
- 如果有從服務(wù)器正在復制當前服務(wù)器,將剛剛執(zhí)行的命令傳播給所有從服務(wù)器
4、服務(wù)器將命令回復返回給客戶端
- 命令回復一開始保存在客戶端狀態(tài)的輸出緩沖區(qū)里,并為客戶端的套接字關(guān)聯(lián)命令回復處理器
- 當客戶端套接字變?yōu)榭蓪憼顟B(tài)時,服務(wù)器會執(zhí)行命令回復處理器,將保存在客戶端輸出緩沖區(qū)的命令回復發(fā)送給客戶端
- 命令回復發(fā)送完畢,回復處理器清空客戶端狀態(tài)的輸出緩沖區(qū)
- 客戶端結(jié)收到協(xié)議格式的命令回復后,解析并打印
初始化服務(wù)器步驟
1、初始化服務(wù)器狀態(tài)
創(chuàng)建struct redisServer類型的實例變量,server作為服務(wù)器的狀態(tài),并為結(jié)構(gòu)中的各個屬性設(shè)置默認值
例如:
設(shè)置服務(wù)器的運行ID
設(shè)置服務(wù)器的默認運行頻率
設(shè)置服務(wù)器的默認配置文件路徑
設(shè)置服務(wù)器的運行架構(gòu)
設(shè)置服務(wù)器的默認端口號
設(shè)置服務(wù)器的默認RDB持久化條件和AOF持久化條件
初始化服務(wù)器的LRU時鐘 創(chuàng)建命令表
2、載入服務(wù)器配置
3、初始化服務(wù)器數(shù)據(jù)結(jié)構(gòu)
除了命令表之外,服務(wù)器狀態(tài)還包含其他數(shù)據(jù)結(jié)構(gòu)
- server.clients鏈表,記錄了所有與服務(wù)器相連的客戶端的狀態(tài)結(jié)構(gòu),鏈表的每個節(jié)點都包含了一個redisClient結(jié)構(gòu)實例
- server.db數(shù)組,數(shù)組中包含了服務(wù)器的所有數(shù)據(jù)庫
- server.pubsub_channels,用于保存頻道訂閱信息的字典
- server.pubsub_patterns,用于保存模式訂閱信息的鏈表
- servber.lua,用于執(zhí)行Lua腳本的Lua環(huán)境
- server.slowlog,用于保存慢查詢?nèi)罩?br /> 之后調(diào)用initServer函數(shù),為數(shù)據(jù)結(jié)構(gòu)分配內(nèi)存,并且設(shè)置初始化值(通過配置文件的參數(shù))
當然該函數(shù)還進行了一些更加重要的操作: - 為服務(wù)器設(shè)置進程信號處理器
- 創(chuàng)建共享對象,之后服務(wù)器將通過重用共享對象來避免反復創(chuàng)建相同的對象
- 打開服務(wù)器的監(jiān)聽端口,并為監(jiān)聽套接字關(guān)聯(lián)連接應(yīng)答事件處理器,等待服務(wù)器正式運行時接收客戶端的連接
- 創(chuàng)建時間事件
- 若AOF持久化功能開啟,那么打開現(xiàn)有的AOF文件,若文件不存在,新建一個
- 初始化服務(wù)器后臺的I/O模塊
4、還原數(shù)據(jù)庫狀態(tài)
- 如果啟用了AOF持久化功能,用AOF文件還原數(shù)據(jù)庫狀態(tài)
- 否則,使用RDB文件還原
5、執(zhí)行事件循環(huán)
總結(jié)
以上是生活随笔為你收集整理的Redis一个命令请求从发送到完成的步骤以及初始化服务器步骤的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何在梦想城镇游戏中建造灯塔建筑
- 下一篇: 重构——解决过长参数列表(long pa