第十二章 事件

2022-06-09 10:27:10 字數 1734 閱讀 6847

檔案事件分為寫事件(ae_writable)和讀事件(ae_readable)

採用i/o復用程式監聽多個套接字,根據套接字當前執行的任務關聯事件處理器。當乙個套接字準備好執行應答、讀取、寫入、關閉操作時,會產生對應的檔案事件,檔案事件分派器會將檔案事件交給對應的事件處理器。

同一時刻可能有多個套接字準備完成,i/o復用程式將這些套接字放到緩衝佇列中,每次只處理乙個套接字。

12.1.5 檔案事件的處理器

redis為檔案處理器關聯了多個處理器,比如

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

1. 伺服器的監聽套接字的ae_readable事件

處於監聽狀態下,事件關聯的應答器為連線應答處理器。

2. 乙個客戶端a向伺服器發起連線請求,監聽套接字產生ae_readable事件,觸發連線應答處理器執行

3. 連線應答處理器為該客戶端建立客戶端套接字以及客戶端狀態,並將客戶端套接字的ae_readable事件關聯到命令請求處理器,使客戶端可以向伺服器傳送命令請求

4. 客戶端a向伺服器傳送請求命令,客戶端套接字建立ae_readable事件,觸發命令請求處理器執行,讀取客戶端命令內容,傳給響應程式執行

5. 執行完畢回傳命令回覆,伺服器將客戶端套接字的ae_writable事件關聯到命令回覆處理器

,當客戶端a嘗試讀取命令回覆時,客戶端套接字產生ae_writable事件,觸發命令回覆處理器執行

6. 命令回覆處理器將回覆內容全部寫入到客戶端套接字,伺服器將客戶端套接字的ae_writable事件解除與命令回覆處理器的關聯

redis的時間事件分為兩類:定時事件週期性事件

乙個時間事件有如下三個屬性:

如果時間事件處理器返回是ae.h/ae_nomore,該事件定義為定時事件,該事件到達一次後被刪除,不會再次到達。如果返回非ae.h/ae_nomore的整數值a,以a更新when屬性,伺服器讓事件在a毫秒後再次到達。目前redis只使用週期性事件

12.2.1 實現

伺服器將所有的時間事件放在乙個無序鍊錶(沒有按照when屬性排序)中,當時間事件執行器執行時,遍歷鍊錶,查詢已到達的時間事件,呼叫相應的事件處理器。鍊錶遍歷不影響效能,正常模式的redis伺服器只使用乙個或者兩個時間事件。

12.2.3 時間事件應用例項:servercron函式

為了保證redis長期執行的穩定性,需要定期對自身資源和狀態進行檢查,定期操作由redis.c/servercron函式負責執行,其主要工作包括

在redis2.6版本中,預設每秒執行10次,在redis2.8開始,可以通過選項配置。

協調時間和檔案事件的處理。

啟動伺服器後,進入迴圈:

對檔案事件和時間事件的處理是同步有序原子地執行,不存在搶占,伺服器也不會中斷某個正在執行的事件轉而處理其他事件。當處理事件過長時,事件對應的命令執行器會主動讓出執行權,降低事件飢餓的可能性。時間事件會將非常耗時的處理放到子執行緒或者子程序中處理。

因為時間事件在檔案事件之後執行,所以執行時間事件時,會比預定時間稍晚。

第十二章 檔案

文字檔案 文字檔案是一種由若干字元構成的檔案,可以用文字編輯器進行閱讀或編輯。以txt py html等為字尾的檔案都是文字檔案。2.二進位制檔案 二進位制檔案一般是指不能用文字編輯器閱讀或編輯的檔案。以 mp4 png等為字尾的檔案都是二進位制檔案,如果想要開啟或修改這些檔案,必須通過特定軟體進行...

第十二章 dp

動態規劃策略 將原始問題拆分為多個子問題,將子問題結果記錄,方便復用子問題的解 遞迴 記憶化 遞推 是動態規劃的一體兩面,本質都是一樣的 遞推減少了呼叫次數,空間上還能優化,一般選擇遞推方式 遞迴 記憶化 int memo maxn 將o 2 n o n intfibonacci int n 遞推 ...

第十二章 異常

一 異常的概念 錯誤 編譯器 異常 執行期,程式沒有正常按照期望執行 異常產生時,在對應位置產生異常型別物件,程式 暫停 如果上下文有異常處理程式,對應處理 沒有則 異常向上傳播 報錯退出 異常向上傳播 如果異常在函式中產生,會傳播給函式的呼叫者 如果異常在模組的頂級位置,會傳播給引用該模組的模組 ...