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訊息處理機制的,只是封裝的更好,讓開發者無須知道底層的訊息處理機制,就可以開發出強大的基於事件的...