Redis命令執行全過程
這個問題說簡單也很簡單,無非就是用戶端發送命令請求,伺服器讀取命令請求,然後是命令執行器尋找命令實現,執行預備操作,調用命令實現函數,執行後續工作。
但是我們想要瞭解的不能簡簡單單的就是這些。下面我們詳細的來分析一下Redis命令執行的全過程。
發送命令請求
但使用者通過用戶端輸入一個命令請求的時候,用戶端首先會對使用者輸入的命令請求進行一個格式轉換,轉換成協議格式,然後通過串連到伺服器的通訊端把這個已經格式化的命令發送給伺服器(伺服器是通過套節字和用戶端或者是其他伺服器串連通訊的)
讀取命令請求
但用戶端與伺服器端的通訊端因為用戶端的寫入而變的可讀時(這點需要查閱Redis檔案事件的內容,這裡不再贅述),
伺服器會首先讀取通訊端中的協議格式的命令請求,並將它儲存到用戶端狀態的輸入緩衝區中(這裡輸入緩衝區的大小可以根據輸入內容動態縮小或者擴大,但是最大不能超過1GB否則伺服器將關閉這個用戶端)
然後伺服器對輸入緩衝區中的命令請求進行分析,提取命令請求中包含的命令參數,以及參數的個數,然後分別將參數和參數個數儲存到用戶端狀態的argv屬性和argc屬性中(argv屬性是一個數組,數組中的每個項都是一個字串對象,其中argv[0]是要執行的命令,之後的其他項是傳給的命令參數,argc屬性負責記錄argv數組的長度)
最後是調用命令執行器,執行用戶端指定的命令。
命令執行
當伺服器分析得到argv和argc屬性的值之後,伺服器會根據arg[0]的值在命令表中尋找所對應的命令實現函數,Redis命令表示一個字典(字典的又一個應用)key是命令的名字,value對應一個redisCommand結構,儲存了命令的實現函數、命令的標誌、命令應該指定的參數個數、命令總執行次數、總消耗時間等統計資訊。
找到實現函數之後並不是真正的執行命令,還需要進行一些檢查操作,
檢查使用者輸入的命令名字是否能找到相應的命令實現,
然後檢查使用者輸入的參數個數是否符合要求(redisCommand結構中有個arity屬性,如果是 -3 表示輸入的參數個數必須大於等於3)
然後還要檢查用戶端是否通過了身分識別驗證,如果通過了身分識別驗證用戶端狀態裡的authenticated屬性的值是1,否則是0(Auth命令)
還有就是記憶體佔用情況、上次執行bgsave出錯的話是否開啟了stop-writes-on-bgsave-error等等檢查。
檢查全部通過之後就是調用命令的實現函數,也就是真正的執行命令了,執行完之後會將執行的結果儲存用戶端狀態的輸出緩衝區中,輸出緩衝區有兩個,一個是固定大小16Kb,用來儲存長度較小的回複,還有就是可變大小的輸出緩衝區,用來儲存長度較大的回複【注意:伺服器通過兩種模式限制用戶端輸出緩衝區的大小,一種是硬性限制,一種是軟性限制,如果超出的硬性限制的大小,伺服器立即關閉用戶端,如果超出的軟性限制,但是沒有超硬性限制,那麼記錄超出的時間,如果一直超出,期間超過了設定的時間,那麼關閉用戶端,相反不會關閉】
最後執行後續的工作,包括更新慢查詢日誌記錄,更新redisCommand結構中的一些統計資訊,還有一些持久化操作,複製操作等。
最後的最後就是將結果發送給用戶端,仍舊是通訊端。
Ubuntu 14.04下Redis安裝及簡單測試
Redis叢集明細文檔
Ubuntu 12.10下安裝Redis(圖文詳解)+ Jedis串連Redis
Redis系列-安裝部署維護篇
CentOS 6.3安裝Redis
Redis安裝部署學習筆記
Redis設定檔redis.conf 詳解
Redis 的詳細介紹:請點這裡
Redis 的:請點這裡
本文永久更新連結地址: