1. 程式人生 > 實用技巧 >Redis的事件機制

Redis的事件機制

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

Redis事件處理流程

aeMain函式通過呼叫aeProcessEvents函式來進行檔案事件和時間事件的排程和執行。aeEventLoop中記錄了事件相關的資訊。首先通過aeSearchNearestTimer函式獲取最短的時間事件的執行時間間隔n,然後呼叫aeApiPoll函式獲取監聽到的套接字,最後執行與套接字向對應的事件處理函式rfileProcwfileProc,最後再執行時間事件函式processTimeEvents

檔案事件

Redis的基於Reactor模式開發了自己的網路事件處理器,這個處理器被稱為檔案事件處理器(file event handler):

  • 檔案事件處理器使用IO多路複用程式來監聽多個套接字,並根據套接字目前執行的任務為套接字關聯不同的事件處理器
  • 當被監聽的套接字準備好執行連線應答(accept)、讀取(read)、寫入(write)、關閉(close)等操作,當檔案事件產生時,這些檔案事件處理器就會呼叫套接字之前關聯好的事件處理器來處理事件
檔案事件處理器的構成

檔案事件的處理器

Redis為檔案事件編寫了多個處理器

  1. 連線應答處理器:當Redis伺服器進行初始化是,程式會將這個連線應答處理器和服務監聽套件字的AE_READABLE事件關聯起來,當有客戶端用connect函式連線伺服器監聽套接字是,套接字就會產生AE_READABLE
    事件,引發連線應答處理器執行,並執行相應的套接字應答操作
  2. 命令請求處理器:當一個客戶端通過連線應答處理器成功連線到伺服器之後,伺服器會將客戶端套接字的AE_READABLE事件和命令請求處理器關聯起來,當客戶端向伺服器傳送命令請求時,套接字就會產生AE_READABLE事件,引發命令請求處理器執行,並執行相應的套接字讀入操作
  3. 命令回覆處理器:當伺服器有命令回覆需要傳遞給客戶端時,服務端會將客戶端套接字的AE_WRITABLE事件和命令回覆處理器關聯起來,當客戶端準備好接收伺服器傳回的命令回覆時,就會產生AE_WRITABLE事件,引發命令回覆處理器執行,並執行相應的套接字寫入操作

一次完整的客戶端與服務端連線事件

  1. 伺服器監聽套件字的AE_READABLE事件,當客戶端傳送連線請求產生AE_READABLE事件,服務端會對客戶端的連線請求進行應答,將客戶端套接字的AE_READABLE事件與命令請求處理器關聯,客戶端可以向服務端傳送命令請求了
  2. 客戶端向服務端傳送一個命令請求,客戶端套接字將產生AE_READABLE事件,引發命令處理器去執行,執行命令將產生相應的命令回覆,服務端將客戶端套接字的AE_WRITABLE事件與命令回覆處理器關聯
  3. 客戶端嘗試讀取命令回覆時,客戶端套接字將產生AE_WRITABLE事件,觸發命令回覆處理器執行,當命令回覆處理器將命令回覆全部寫入套接字之後,伺服器就會接觸客戶端套接字的AE_WRITABLE事件與命令回覆處理器之間的關聯

時間事件

Redis的時間事件分為定時事件和週期性事件。一個時間事件由三個屬性組成:

  • id:伺服器為時間時間建立的全域性唯一ID
  • when:記錄了時間時間的到達時間(毫秒精度的UNIX時間戳)
  • timeProc:時間事件處理器

伺服器所有的時間事件都放在一個無序連結串列中,每當時間事件執行器執行時,它就遍歷整個連結串列,查詢所有已到達的時間事件,並呼叫相應的事件處理器。正常模式下的Redis伺服器只使用serverCron一個時間事件,而在benchmark模式下,伺服器也只使用兩個時間事件,所以不影響事件執行的效能