redis文件事件
- 定義:redis服務器通過套接字socket與其他redis服務或者客戶端進行通信,每次通信會產生文件事件而redis通過監聽和處理這些事件來完成一系列網絡通信操作。
- 實現:redis基於unix網絡通信模型的I/O復用模型,一個線程監控多個套接字,當某個套接接收到信息,由事件分發器將其分發到對應的事件處理器中去處理。
- 不排除多個套接字同時觸發事件,此時redis會將這些事件通過一個隊列排隊由主線程一個一個處理。
- tips:如果一個套接字既可讀又可寫,且同時觸發了這兩個事件,那么會優先處理讀,再處理寫。
- 文件事件的處理器:
- 連接應答處理器
- 命令請求處理器
- 命令回復處理器
- 一次完整的客戶端與服務端連接示例:
- redis服務端啟動狀態,監聽socket AE_READABLE事件,該事件所對應的處理器為連接應答處理器,如果這時有一個客戶端向服務器發起連接,會觸發AE_READABEL事件,觸發連接應答處理器執行,處理器會對client的連接請求進行應答然后創建client socket,包括client的狀態,將client socket 的AE_READABLE事件與命令請求處理器相關聯,使client可以向server發送命令請求,之后client向server發送命令請求,觸發AE_READABLE事件,引發命令請求處理器執行,讀取命令內容然后交給相關程序執行,執行命令將產生相應的命令回復,為了將這些命令回復給客戶端,server會將client socket的AE_WRITABLE事件與命令回復處理器相關聯,當client想讀取回復時,生成AE_WRITABLE事件,觸發命令回復處理器執行,當回復全部寫入socket后,server就會解除client socket的AE_WRITABLE事件與命令回復處理器的關聯。
redis時間事件
- 有定時事件和周期性事件
- redis一般情況下只會運行一個時間事件,serverCron,並且它是周期性事件。
tips:當文件事件和時間事件一起發生時,redis server會先處理文件事件,不會發生資源爭搶,所以時間事件一般比預設事件晚一些發生。