Redis中的事件機制
阿新 • • 發佈:2019-02-09
Redis伺服器是一個事件驅動程式,伺服器需要處理兩類事件:檔案事件和時間事件。檔案事件主要指客戶端向伺服器傳送命令,如連線命令,讀命令以及寫命令等。時間事件指的是定時執行的任務,如serverCron函式。
一.檔案事件
Redis基於Reactor模式開發了自己的網路時間處理器,稱為檔案事件處理器。檔案事件處理器使用I/O多路複用程式同時監聽多個套接字,並根據套接字目前執行的任務為套接字關聯不同的事件處理器。
雖然檔案事件處理器以單執行緒方式執行,但通過I/O多路複用程式監聽多個套接字的方式,檔案事件處理器可以實現高效能的網路通訊模型。
檔案事件處理器由四部分組成,分別是套接字,I/O多路複用程式,檔案事件分派器,以及事件處理器。
每當一個套接字準備好執行連線應答,寫入,讀取,關閉等操作時,就會產生一個檔案事件。因為一個伺服器通常會連線多個套接字,所以多個檔案事件有可能會併發地出現。 I/O多路複用程式負責監聽多個套接字,並向檔案事件分派器傳送那些產生了事件的套接字。 儘管多個檔案事件可能會併發地出現,但I/O多路複用程式總是會將所有產生事件的套接字都放到一個佇列裡面,然後通過這個佇列,以有序,同步,每次一個套接字的方式向檔案事件分派器傳送套接字。當上一個套接字產生的事件被吹完畢之後,I/O多路複用程式才會繼續向檔案事件分派器傳送下一個套接字。 二.時間事件 Redis的時間事件分為兩類:定時事件和週期性時間。定時事件指程式在指定時間之後執行一次,執行完定時事件就刪除了。而週期性事件是程式每隔指定時間就執行一次。 一個時間事件主要由以下三個屬性組成:id,伺服器為每個時間事件建立的全域性唯一ID;when,記錄時間事件的到達時間;timeProc,時間事件處理器,一個函式。當時間事件到達時,伺服器會呼叫相應處理器來處理事件。 伺服器將所有時間事件都放在一個無序連結串列 中,每當時間事件執行器執行時,就會遍歷整個連結串列,查詢所有已到達的時間事件,呼叫相應的時間處理器。
時間事件的處理大概包括以下幾步:
1.遍歷連結串列中的所有時間事件
2.檢查時間事件的when是否<=當前時間戳,判斷時間事件是否到達
3.執行已到達的時間事件,並取得處理器返回值
4.根據返回值判斷是定時事件還是週期事件,如果是定時事件,從連結串列中刪除時間,如果是週期性事件,則更新時間的when屬性
三.事件的排程與執行
伺服器同時存在檔案事件和時間事件兩種事件,所以伺服器必須對兩種事件進行排程,何時處理檔案事件,何時處理時間事件。
伺服器會迴圈處理所有事件,首先會獲取最近到達的時間事件,然後阻塞等待處理檔案事件,最大阻塞時間為最近到達的時間事件,等到最近時間事件已到達的時候,就會處理時間事件。伺服器對檔案事件和時間事件的處理都是同步,有序,原子的,不會中斷時間處理也不會對時間進行搶佔,因此伺服器處理時間都會盡可能地減少程式阻塞的時間。因為時間事件在檔案事件之後執行,並且事件之間不會出現搶佔,所以時間事件的實際處理時間通常會比設定的到達時間晚一點。
參考內容:Redis設計與實現-黃健巨集
每當一個套接字準備好執行連線應答,寫入,讀取,關閉等操作時,就會產生一個檔案事件。因為一個伺服器通常會連線多個套接字,所以多個檔案事件有可能會併發地出現。 I/O多路複用程式負責監聽多個套接字,並向檔案事件分派器傳送那些產生了事件的套接字。 儘管多個檔案事件可能會併發地出現,但I/O多路複用程式總是會將所有產生事件的套接字都放到一個佇列裡面,然後通過這個佇列,以有序,同步,每次一個套接字的方式向檔案事件分派器傳送套接字。當上一個套接字產生的事件被吹完畢之後,I/O多路複用程式才會繼續向檔案事件分派器傳送下一個套接字。 二.時間事件 Redis的時間事件分為兩類:定時事件和週期性時間。定時事件指程式在指定時間之後執行一次,執行完定時事件就刪除了。而週期性事件是程式每隔指定時間就執行一次。 一個時間事件主要由以下三個屬性組成:id,伺服器為每個時間事件建立的全域性唯一ID;when,記錄時間事件的到達時間;timeProc,時間事件處理器,一個函式。當時間事件到達時,伺服器會呼叫相應處理器來處理事件。 伺服器將所有時間事件都放在一個無序連結串列