Redis服務器是一個事件驅動程式,服務器需要處理兩類事件:檔案事件(file event)和時間事件(time event)
Redis事件處理流程

aeMain函式通過呼叫aeProcessEvents函式來進行檔案事件和時間事件的調度和執行,aeEventLoop中記錄了事件相關的資訊,首先通過aeSearchNearestTimer函式獲取最短的時間事件的執行時間間隔n,然后呼叫aeApiPoll函式獲取監聽到的套接字,最后執行與套接字向對應的事件處理函式rfileProc和wfileProc,最后再執行時間事件函式processTimeEvents
檔案事件
Redis的基于Reactor模式開發了自己的網路事件處理器,這個處理器被稱為檔案事件處理器(file event handler):
- 檔案事件處理器使用IO多路復用程式來監聽多個套接字,并根據套接字目前執行的任務為套接字關聯不同的事件處理器
- 當被監聽的套接字準備好執行連接應答(accept)、讀取(read)、寫入(write)、關閉(close)等操作,當檔案事件產生時,這些檔案事件處理器就會呼叫套接字之前關聯好的事件處理器來處理事件
檔案事件處理器的構成

檔案事件的處理器
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模式下,服務器也只使用兩個時間事件,所以不影響事件執行的性能
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/145069.html
標籤:Java
下一篇:Redis的復制模式
