1. 程式人生 > >Redis深入之路(十一)

Redis深入之路(十一)

事件

Redis 基於 Reactor 模式開發了自己的網路時間處理器:檔案事件處理器(File Event Handler)

  • 檔案事件處理器基於 I/O 多路複用(multiplexing)程式來同時監聽多個套接字(Socket),並根據套接字目前執行的任務來為套接字關聯不同的事件處理器。
  • 當被監聽的套接字準備好執行連線應答(accept)、讀取(read)、寫入(write)、關閉(close)等操作時,與操作相對應的檔案事件就會產生,此時檔案事件處理器就會呼叫套接字之前關聯好的事件處理器來處理具體的事件。

雖然檔案事件處理器以單執行緒的方式執行,但是通過 I/O 多路複用(multiplexing)來監聽多個套接字,檔案事件處理器既實現了高效能的網路通訊模型,又可以很好的和 Redis 內部同樣以單執行緒方式執行的模組很好的對接,保持了 Redis 內部單執行緒設計的簡單性。

構成

檔案事件處理器包括四個部分:套接字、I/O 多路複用程式、檔案事件分派器、事件處理器。

I/O 多路複用

I/O 多路複用程式監聽多個套接字,並向檔案事件分派器傳遞那些產生了事件的套接字。
一個伺服器連線多個套接字,所以檔案事件可能會併發出現,但是 I/O 多路複用程式總是將產生事件的套接字放到一個佇列裡面,然後通過這個佇列,以有序、同步、每次一個套接字的方式向檔案事件分派器傳送套接字。

Redis 根據作業系統,自動選擇最高效率的 I/O 多路複用實現:

/* Include the best multiplexing layer supported by this system.
 * The following should be ordered by performances, descending. */
#ifdef HAVE_EVPORT #include "ae_evport.c" #else #ifdef HAVE_EPOLL #include "ae_epoll.c" #else #ifdef HAVE_KQUEUE #include "ae_kqueue.c" #else #include "ae_select.c" #endif #endif #endif

檔案事件分派器

檔案事件分派器結構 I/O 多路複用程式傳來的套接字,並根據套接字產生的事件型別,呼叫對應的事件處理器。

事件處理器

事件處理器是一個個函式,定義了某個事件發生時,伺服器應該執行的動作, 伺服器為不同任務的套接字關聯不同的事件處理器。

事件的型別

I/O 多路複用程式監聽多個套接字的讀和寫事件:

  • 套接字變得可讀:客戶端對套接字執行 write 操作,或者 close 操作,或者有新的可應答(acceptable)套接字出現時(客戶端對伺服器的監聽套接字執行 connect 操作),此時伺服器的套接字會產生 AE_READABLE 事件。
  • 套接字變得可寫:客戶端對服務端的套接字執行 read 操作,伺服器的套接字將產生 AE_WRITABLE 事件。

詳情見原始碼檔案:
ae_epoll.c、ae.c、networking.c