前言:
我們知道redis伺服器是一個事件驅動程序,它需要處理兩類事件,分別是檔案事件和時間事件。
那麼redis事件處理流程是什麼樣的呢?我們一起來看看下面的圖:
aeMain函數透過呼叫aeProcessEvents函數來進行檔案事件和時間事件的調度和執行。 aeEventLoop中記錄了事件相關的資訊。首先透過aeSearchNearestTimer函數取得最短的時間事件的執行時間間隔n,然後呼叫aeApiPoll函數取得監聽到的套接字,最後執行與套接字向對應的事件處理函數rfileProc和wfileProc,最後再執行時間事件函數processTimeEvents
檔案事件
Redis的基於Reactor模式開發了自己的網路事件處理器,這個處理器被稱為檔案事件處理器(file event handler):
檔案事件處理器使用IO多路復用程式來監聽多個套接字,並根據套接字目前執行的任務為套接字關聯不同的事件處理器
#當被監聽的套接字準備好執行連接應答(accept)、讀取(read)、寫入(write)、關閉(close)等操作,當檔案事件產生時,這些檔案事件處理器就會呼叫套接字之前關聯好的事件處理器來處理事件
檔案事件處理器的組成
(學習影片分享: redis視訊教學)
檔案事件的處理器
Redis為檔案事件編寫了多個處理器:
#連接應答處理器:當Redis伺服器進行初始化是,程式會將這個連接應答處理器和服務監聽套件字的AE_READABLE事件關聯起來,當有客戶端用connect函數連接伺服器監聽套接字是,套接字就會產生AE_READABLE事件,引發連接應答處理器執行,並執行對應的套接字應答操作
指令請求處理器:當一個客戶端透過連接應答處理器成功連接到伺服器之後,伺服器會將客戶端套接字的AE_READABLE事件和命令請求處理器關聯起來,當客戶端向伺服器發送命令請求時,套接字就會產生AE_READABLE事件,引發命令請求處理器執行,並執行對應的套接字讀入操作
指令回覆處理器:當伺服器有指令回覆需要傳遞給客戶端時,服務端會將客戶端套接字的AE_WRITABLE事件和命令回复處理器關聯起來,當客戶端準備好接收伺服器傳回的命令回复時,就會產生AE_WRITABLE事件,引發命令回复處理器執行,並執行相應的套接字寫入操作
一次完整的客戶端與服務端連接事件
伺服器監聽套件字的AE_READABLE事件,當客戶端發送連線請求產生AE_READABLE事件,服務端會對客戶端的連線請求進行應答,將客戶端套接字的AE_READABLE事件與命令請求處理器關聯,客戶端可以向服務端發送命令請求了
客戶端向服務端發送一個命令請求,客戶端套接字將產生AE_READABLE事件,引發命令處理器去執行,執行命令將產生相應的命令回复,服務端將客戶端套接字的AE_WRITABLE事件與命令回復處理器關聯
客戶端嘗試讀取命令回复時,客戶端套接字將產生AE_WRITABLE事件,觸發命令回復處理器執行,當命令回復處理器將命令回复全部寫入套接字之後,伺服器就會接觸到客戶端套接字的AE_WRITABLE事件與指令回覆處理器之間的關聯
時間事件
Redis的時間事件分為定時事件和週期性事件。一個時間事件由三個屬性組成:
id:伺服器為時間時間創建的全域唯一IDwhen:記錄了時間時間的到達時間(毫秒精度的UNIX時間戳)timeProc:時間事件處理器
伺服器所有的時間事件都放在一個無序鍊錶中,每當時間事件執行器運作時,它就會遍歷整個鍊錶,尋找所有已到達的時間事件,並呼叫對應的事件處理器。正常模式的Redis伺服器只使用serverCron一個時間事件,而在benchmark模式下,伺服器也只使用兩個時間事件,所以不影響事件執行的效能。
相關推薦:redis資料庫教學
以上是redis事件處理流程分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!