redis設計與實現讀書筆記-事件

事件

Redis服務器是一個事件驅動程序,

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

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

文件事件

Redis基於Reactor模式開發了自己的網絡事件處理器:

這個處理器被稱爲文件事件處理器(fileevent handler):

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

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

文件事件處理器的構成

套接字、I/O多路複用程序、文件事件分派器(dispatcher),以及事件處理器。

I/O多路複用程序總是會將所有產生事件的套接字都放到一個隊列裏面,然後通過這個隊列,以有序(sequentially)、同步(synchronously)、每次一個套接字的方式向文件事件分派器傳送套接字。

時間事件

❑定時事件:讓一段程序在指定的時間之後執行一次。比如說,讓程序X在當前時間的30毫秒之後執行一次。

❑週期性事件:讓一段程序每隔指定時間就執行一次。比如說,讓程序Y每隔30毫秒就執行一次。

服務器將所有時間事件都放在一個無序鏈表中,每當時間事件執行器運行時,它就遍歷整個鏈表,查找所有已到達的時間事件,並調用相應的事件處理器。

時間事件應用實例:serverCron函數

這個函數,之前的持久化筆記也記錄過,定時持久化用的,這裏看看還有啥作用:

serverCron函數負責執行,它的主要工作包括:

❑更新服務器的各類統計信息,比如時間、內存佔用、數據庫佔用情況等。

❑清理數據庫中的過期鍵值對。

❑關閉和清理連接失效的客戶端。

❑嘗試進行AOF或RDB持久化操作。

❑如果服務器是主服務器,那麼對從服務器進行定期同步。

❑如果處於集羣模式,對集羣進行定期同步和連接測試。

事件的調度與執行

對文件事件和時間事件的處理都是同步、有序、原子地執行的,服務器不會中途中斷事件處理,也不會對事件進行搶佔,因此,不管是文件事件的處理器,還是時間事件的處理器,它們都會盡可地減少程序的阻塞時間,並在有需要時主動讓出執行權,從而降低造成事件飢餓的可能性

重點回顧

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

❑文件事件處理器是基於Reactor模式實現的網絡通信程序。

❑文件事件是對套接字操作的抽象:每次套接字變爲可應答(acceptable)、可寫(writable)或者可讀(readable)時,相應的文件事件就會產生。

❑文件事件分爲AE_READABLE事件(讀事件)和AE_WRITABLE事件(寫事件)兩類。

❑時間事件分爲定時事件和週期性事件:定時事件只在指定的時間到達一次,而週期性事件則每隔一段時間到達一次。❑服務器在一般情況下只執行serverCron函數一個時間事件,並且這個事件是週期性事件。

❑文件事件和時間事件之間是合作關係,服務器會輪流處理這兩種事件,並且處理事件的過程中也不會進行搶佔。❑時間事件的實際處理時間通常會比設定的到達時間晚一些。

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