redis-事件

一、概述:

redis 服務器是一個事件驅動的程序,服務器處理的時間分爲時間事件和文件事件兩類。redis

二、文件事件

2.一、redis基於Reactor模式開發了本身的網絡時間處理器:這個處理器被稱爲文件事件處理器。服務器

  • 文件事件處理器使用I/O多路複用程序來同時監聽多個套接字,並根據套接字目前執行的任務來爲套接字關聯不一樣的事件處理器。
  • 當被監聽的套接字準備好執行鏈接應答(accept)、讀取(read)、寫入(write)、關閉(close)等操做時, 與操做相對應的文件事件就會產生, 這時文件事件處理器就會調用套接字以前關聯好的事件處理器來處理這些事件。

儘管多個文件事件可能會併發地出現, 但 I/O 多路複用程序老是會將全部產生事件的套接字都入隊到一個隊列裏面, 而後經過這個隊列, 以有序(sequentially)、同步(synchronously)、每次一個套接字的方式向文件事件分派器傳送套接字: 當上一個套接字產生的事件被處理完畢以後(該套接字爲事件所關聯的事件處理器執行完畢), I/O 多路複用程序纔會繼續向文件事件分派器傳送下一個套接字, 如圖 IMAGE_DISPATCH_EVENT_VIA_QUEUE 。

2.二、I/O 多路複用程序的實現

2.三、一次完整的客戶端與服務器鏈接事件示例 讓咱們來追蹤一次 Redis 客戶端與服務器進行鏈接併發送命令的整個過程, 看看在過程當中會產生什麼事件, 而這些事件又是如何被處理的。

假設一個 Redis 服務器正在運做, 那麼這個服務器的監聽套接字的 AE_READABLE 事件應該正處於監聽狀態之下, 而該事件所對應的處理器爲鏈接應答處理器。網絡

若是這時有一個 Redis 客戶端向服務器發起鏈接, 那麼監聽套接字將產生 AE_READABLE 事件, 觸發鏈接應答處理器執行: 處理器會對客戶端的鏈接請求進行應答, 而後建立客戶端套接字, 以及客戶端狀態, 並將客戶端套接字的 AE_READABLE 事件與命令請求處理器進行關聯, 使得客戶端能夠向主服務器發送命令請求。併發

以後, 假設客戶端向主服務器發送一個命令請求, 那麼客戶端套接字將產生 AE_READABLE 事件, 引起命令請求處理器執行, 處理器讀取客戶端的命令內容, 而後傳給相關程序去執行。函數

執行命令將產生相應的命令回覆, 爲了將這些命令回覆傳送回客戶端, 服務器會將客戶端套接字的 AE_WRITABLE 事件與命令回覆處理器進行關聯: 當客戶端嘗試讀取命令回覆的時候, 客戶端套接字將產生 AE_WRITABLE 事件, 觸發命令回覆處理器執行, 當命令回覆處理器將命令回覆所有寫入到套接字以後, 服務器就會解除客戶端套接字的 AE_WRITABLE 事件與命令回覆處理器之間的關聯。3d

圖 IMAGE_COMMAND_PROGRESS 總結了上面描述的整個通信過程, 以及通信時用到的事件處理器。cdn

三、時間事件

3.一、redis的時間事件分爲定時事件和週期性事件。server

  • 當時間事件處理器返回AE_NOMORE則表明是定時事件,放返回一個整數時,若是30,表明30毫秒再次到達,服務器會更新when的時間戳。

3.二、服務端能夠經過函數建立刪除時間事件。 blog

  • ae.c/aeCreateTimeEevent(long milliseconds,Hander proc) 建立
  • ae.c/aeDeleteFileEvent(long id) 刪除 3.三、代碼邏輯

其中processFileEvents()是僞代碼,從代碼邏輯中能夠看出,redis服務端會先執行文件事件在執行時間事件。

重點

  • Redis 服務器是一個事件驅動程序, 服務器處理的事件分爲時間事件和文件事件兩類。
  • 文件事件處理器是基於 Reactor 模式實現的網絡通信程序。 文件事件是對套接字操做的抽象: 每次套接字變得可應答(acceptable)、可寫(writable)或者可讀(readable)時, 相應的文件事件就會產生。
  • 文件事件分爲 AE_READABLE 事件(讀事件)和 AE_WRITABLE 事件(寫事件)兩類。
  • 時間事件分爲定時事件和週期性事件: 定時事件只在指定的時間達到一次, 而週期性事件則每隔一段時間到達一次。
  • 服務器在通常狀況下只執行 serverCron 函數一個時間事件, 而且這個事件是週期性事件。
  • 文件事件和時間事件之間是合做關係, 服務器會輪流處理這兩種事件, 而且處理事件的過程當中也不會進行搶佔。
  • 時間事件的實際處理時間一般會比設定的到達時間晚一些。
相關文章
相關標籤/搜索