redis伺服器是乙個事件驅動程式,伺服器需要處理兩類事件:
1) 檔案事件:redis伺服器通過套接字與客戶端進行連線,而檔案事件就是伺服器對套接字操作的抽象。
2) 時間事件:redis伺服器的一些操作需要在給定的時間點執行,而時間事件就是伺服器對這類定時操作的抽象。
redis基於reactor模式開發了自己的網路事件處理器,這個處理器被稱為檔案事件處理器:
1) 檔案事件處理器使用i/o多路復用程式來同時監聽多個套接字,並根據套接字目前執行的任務來為套接字關聯不同的事件處理器。
2) 當被監聽的套接字準備好執行連線應答、讀取、寫入、關閉等操作時,與操作相對應的檔案事件就會產生,這時檔案事件處理器就會呼叫套接字之前關聯好的事件處理器來處理這些事件。
雖然檔案事件處理器以單執行緒的方式執行,但通過使用i/o多路復用程式來監聽多個套接字,檔案事件處理器既實現了高效能的網路通訊模型,又可以很好地與redis伺服器中其他同樣以單執行緒方式執行的模組進行對接,這保持了redis內部單執行緒設計的簡單性。
redis在i/o多路復用程式的實現原始碼中用#include巨集定義了相應的規則,程式會在編譯時自動選擇系統中效能最高的i/o多路復用函式庫來作為redis的i/o多路復用程式的底層實現。
redis的時間事件分為兩類:
1) 定時事件:讓一段程式在指定的時間之後執行一次
乙個時間事件主要由三個屬性組成:
1) id:伺服器為時間事件建立的全域性唯一id
2) when,記錄了時間事件到達的事件
3) timeproc,時間事件處理器,乙個函式。當時間事件到達時,伺服器就會呼叫相應的處理器來處理事件
伺服器將所有的時間事件都放在乙個無序鍊錶(不按when屬性的大小排序)中,每當時間事件執行器執行時,它就遍歷整個鍊錶,查詢所有已到達的時間事件,並呼叫相應的事件處理器。
伺服器中同時存在檔案事件和時間事件兩種事件型別,所以伺服器必須對這兩種事件進行排程,決定何時應該處理檔案事件,何時又應該處理時間事件,以及花多少時間來處理他們。
事件排程和執行的規則:
1) aeapipoll函式的最大阻塞時間由到達時間最接近當前時間的時間事件決定
2) 因為檔案事件是隨機出現的,如果等待並處理完一次檔案事件之後,仍未有任何時間事件到達,那麼伺服器將再次等待並處理檔案事件。隨著檔案事件的不斷執行,時間會逐漸向時間事件所設定的到達時間逼近,並最終來到到達時間,這是伺服器就可以開始處理到達的時間事件了。
3) 對檔案事件和時間事件的處理都是同步、有序、原子地執行,伺服器不會中途中斷事件處理,也不會對事件進行搶占,因此,不管是檔案事件的處理器,還是時間事件的處理器,他們都會盡可能地減少程式的阻塞時間,並在有需要的時主動讓出執行權,從而降低造成事件飢餓的可能性。
4) 因為時間事件在檔案事件之後執行,並且事件之間不會出現搶占,所以時間事件的實際處理時間,通常會比時間事件設定的到達時間稍晚一些。
《Redis設計與實現》之第十二章 事件
redis伺服器是乙個事件驅動程式,伺服器需要處理兩類事件 檔案事件 檔案事件就是伺服器對套接字 socket 操作的抽象,伺服器和客戶端的通訊會產生檔案事件 時間事件 時間事件就是伺服器對定時操作 比如servercron函式 的抽象,redis伺服器中的一些操作需要在給定的時間點執行 一,檔案事...
《Redis設計與實現》之第十二章 事件
redis伺服器是乙個事件驅動程式,伺服器需要處理兩類事件 檔案事件 檔案事件就是伺服器對套接字 socket 操作的抽象,伺服器和客戶端的通訊會產生檔案事件 時間事件 時間事件就是伺服器對定時操作 比如servercron函式 的抽象,redis伺服器中的一些操作需要在給定的時間點執行 一,檔案事...
《Redis設計與實現》之第十二章 事件
redis伺服器是乙個事件驅動程式,伺服器需要處理兩類事件 檔案事件 檔案事件就是伺服器對套接字 socket 操作的抽象,伺服器和客戶端的通訊會產生檔案事件 時間事件 時間事件就是伺服器對定時操作 比如servercron函式 的抽象,redis伺服器中的一些操作需要在給定的時間點執行 一,檔案事...