Redis 事件(1) -- 文件事件

Redis 服務器是一個事件驅動程序,服務器需要處理以下兩類事件:

1)文件事件

Redis服務器通過套接字與客戶端(或其他Redis服務器)進行連接,而文件時間就是服務器對套接字操作的抽象。服務器與客戶端(或其他服務器)的通信會產生相應的文件事件,而服務器則通過監聽並處理這些時間來完成一系列網絡通信操作。

2)時間事件

Redis服務器中的一些操作(比如serverCron函數)需要在給定的時間點執行,而時間事件就是服務器對這類定時操作的抽象。

1.文件事件

Redis基於Reactor模式開發了自己的網絡事件處理器:這個處理器被稱爲文件事件處理器:

a,文件事件處理器使用I/O多路複用程序來同時監聽多個套接字,並根據套接字目前執行的任務來爲套接字關聯不同的事件處理器。

b.當被監聽的套接字準備好執行連接應答、讀取、寫入、關閉等操作時,與操作相對應的文件事件就會產生,調用套接字之前關聯好的事件處理器來處理這些事件。

雖然文件事件處理器以單線程方式運行,但通過I/O多路複用程序來監聽多個套接字,文件事件處理器既實現了高性能的網絡通信模型,又可以很好地與Redis服務器中其他同樣以單線程方式運行的模塊進行對接。


2.文件事件處理器

4部分:套接字、 I/O多路複用程序 、 文件事件分派器 和 事件處理器。

文件事件是對套接字操作的抽象,每當一個套接字準備好執行連接應答、寫入、讀取、關閉等操作時,就會產生一個文件事件。服務器通常會連接多個套接字,所以多個文件事件可能併發出現。

I/O多路複用程序負責監聽多個套接字,並向文件事件分派器傳送那些產生了事件的套接字。

儘管多個文件事件會有併發,但IO複用程序會將所有產生事件的套接字都放到一個隊列裏面,然後通過這個隊列,以有序、同步、每次一個套接字的方式向文件事件分派器傳送套接字。當上一個套接字產生的事件被處理完之後(該套接字爲事件所關聯的事件處理器執行完畢)。IO多路複用程序纔會繼續向文件事件分派器傳送下一個套接字。

文件事件分派器接受IO多路複用程序傳來的套接字,並根據套接字所產生的事件類型條用相應的事件處理器。

服務器會爲執行不同任務的套接字關聯不同的事件處理器,這些處理器是一個個函數,它們定義了某個事件發生時,服務器應執行的動作。


3.IO多路複用程序的實現

Redis的IO多路複用程序的所有功能都是通過包裝常見的select、epoll、evport和kqueue這些IO多路複用函數庫來實現的,每個IO多路複用函數庫在Redis源碼中都對應一個單獨的文件。


4.事件的類型

IO多路複用程序會監聽多個套接字的ae,h/AE_READABLE事件和ae.h/AE_WRITEABLE事件,對應關係如下:

a.當套接字變得可讀時(客戶端對套接字執行write操作,或執行close操作),或者有新的可應答套接字出現時,套接字產生AE_READABLE事件。

b.當套接字變得可寫時(客戶端對套接字執行read操作),套接字產生AE_WRITEABLE事件。

如果同時產生2種事件,文件事件分派器會優先處理AE_READABLE事件,完成之後再處理AE_WRITEABLE事件。


5.文件事件處理器

a.連接應答處理器

b.命令請求處理器

c.命令回覆處理器

下面通過一個例子來說明各個處理器的作用:

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

如果這是有一個Redis客戶端向服務器發起連接,那麼監聽套接字將產生AE_READABLE事件,觸發連接應答處理器執行。處理器會對客戶端的連接請求進行應答,然後創建客戶端套接字,以及客戶端狀態,並將客戶端套接字的AE_READABLE事件與命令請求處理器進行關聯,使得客戶端可以向主服務器發送命令請求。

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

執行命令產生的命令回覆,需要傳送回客戶端,服務器會將客戶端套接字的AE_WRITEABLE事件與命令回覆處理器進行關聯。當客戶端嘗試讀取命令回覆的時候,客戶端套接字將產生AE_WRITEABLE事件,觸發命令回覆處理器執行,當命令回覆處理器將命令回覆全部寫入到套接字之後,服務器就會接觸客戶端套接字的AE_WRITEABLE事件與命令回覆處理器之間的關聯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章