檔案事件 時間事件

2022-01-31 06:52:34 字數 2420 閱讀 9598

redis是乙個事件驅動程式

主要包含

檔案事件和時間事件

檔案事件:主要就是server和client進行操作產生的檔案

時間事件:主要就是一些需要定時執行的事件。

檔案事件:

檔案事件處理器是單執行緒執行的,但是通過io多路復用,可以處理多個套接字

下面是檔案事件處理器的結構

檔案事件處理器主要是上面四個部分構成的

檔案事件其實就是對套接字操作的抽象,我們當執行讀寫的時候就會產生,因為檔案事件處理器可以連線多個套接字,所以可能多個檔案事件同時發生,但是io多路程式會將這些檔案事件都放在乙個佇列裡面,通過檔案事件分派器分配不同的處理器,每次只能分配乙個,必須等上乙個處理結束了才會繼續處理下乙個

io多路復用的所有功能都是sselct,epoll這些庫封裝形成的,至於呼叫哪乙個,完全看具體情況使用哪乙個的效率

事件處理器的io多路復用可以監聽多個socket的讀寫時間,當發生讀事件的時候,產生ae_readable,當產生寫事件的時候,發生ae_writable事件。,如果多個套接字同時產生讀寫時間,我們會先執行讀事件,在執行寫事件

檔案的事件處理器:

連線應答處理器

命令請求處理器:

命令回覆處理器

當client連線server的時候,會觸發socket的readable執行連線應答處理器。當客戶端通過連線應答處理器成功連線到server的時候,我們會將ae_readable和命令請求處理器關聯起來,當客戶端向伺服器傳送請求命令的時候,套接字就會產生ae_readable事件,並傳送給命令請求處理器,結束後,當server需要回覆client的時候,就會將socket和ae_writeable事件關聯起來。當客戶端需要read的時候就會觸發這個事件。傳送結束會,就會將socket和ae_writeabel解除關聯

一次完整的客戶端與伺服器連線事件示例

讓我們來追蹤一次 redis 客戶端與伺服器進行連線並傳送命令的整個過程, 看看在過程中會產生什麼事件, 而這些事件又是如何被處理的。

假設乙個 redis 伺服器正在運作, 那麼這個伺服器的監聽套接字的 ae_readable 事件應該正處於監聽狀態之下, 而該事件所對應的處理器為連線應答處理器。

如果這時有乙個 redis 客戶端向伺服器發起連線, 那麼監聽套接字將產生 ae_readable 事件, 觸發連線應答處理器執行: 處理器會對客戶端的連線請求進行應答, 然後建立客戶端套接字, 以及客戶端狀態, 並將客戶端套接字的 ae_readable 事件與命令請求處理器進行關聯, 使得客戶端可以向主伺服器傳送命令請求。

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

執行命令將產生相應的命令回覆, 為了將這些命令回覆傳送回客戶端, 伺服器會將客戶端套接字的 ae_writable 事件與命令回覆處理器進行關聯: 當客戶端嘗試讀取命令回覆的時候, 客戶端套接字將產生 ae_writable 事件, 觸發命令回覆處理器執行, 當命令回覆處理器將命令回覆全部寫入到套接字之後, 伺服器就會解除客戶端套接字的 ae_writable 事件與命令回覆處理器之間的關聯。

時間事件:

時間事件包括定時事件和週期性事件

定時事件就是執行一次

週期性事件都按照週期執行的

時間事件的屬性有下面3個

id遞增的

when:unix時間戳,表示什麼時候執行

timeproc:時間事件處理器,乙個函式,

實現其實就是乙個鍊錶

伺服器會定期處理時間事件:

首先會遍歷1所有的時間事件,看看哪個到了時間,如果時間到了的話。會判斷返回值是否為ae_nomore,如果是的話,從server刪除,不是的話,會設定返回值的時間後繼續觸發執行

時間事件函式:servercron函式

server會定期執行這個函式,這個函式有很多任務作,比如對server資源的統計,比如記憶體,cpu等等

清理過期鍵

關閉和清理失效的客戶端請求

嘗試進行aof和rbd

主從的同步

集群的定期連線測試

因為有兩種事件,所以排程就是乙個問題,我們需要怎麼合理安排事件的排程

我們在選擇的時候,經常會選擇距離到達時間最近的時間事件,計算時間差,如果沒有檔案事件到達,可能會阻塞,等待檔案事件的到來,檔案事件到了之後,會先處理檔案事件,等檔案事件處理完了之後,在處理時間事件,所以通常時間事件的處理時間有的時候會被到來的晚一些

Linux 監控檔案事件

某些應用程式需要對檔案或者目錄進行監控,來偵測其是否發生了某些事件。linux很貼心的為我們提供了inotify api,也是linux的專有。在使用之前一定要有乙個inotify例項,int inotify init void 返回乙個inotify例項的描述符。新增監控描述符,int inoti...

js 事件 事件物件

關於事件寫了一系列文章 1.事件流 事件捕獲和事件冒泡 2.事件處理程式 3.事件物件 本文介紹事件物件 4.通用的事件偵聽器函式 5.事件迴圈 event loop 6.事件 event delegation 1.事件物件 觸發dom上的某個物件時,會產生乙個事件物件event dom0級事件物件...

C 事件 事件解析

事件 event 這個詞兒對於初學者來說,往往總是顯得有些神秘,不易弄懂。而這些東西卻往往又是程式設計中常用且非常重要的東西。大家都知道windows訊息處理機制的重要,其實c 事件就是基於windows訊息處理機制的,只是封裝的更好,讓開發者無須知道底層的訊息處理機制,就可以開發出強大的基於事件的...