重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
這篇文章主要介紹了redis事件處理流程的案例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
前言:
我們知道redis服務器是一個事件驅動程序,它需要處理兩類事件,分別是文件事件和時間事件。
那么redis事件處理流程是什么樣的呢?我們一起來看看下面的圖:
aeMain函數通過調用aeProcessEvents函數來進行文件事件和時間事件的調度和執行。aeEventLoop中記錄了事件相關的信息。首先通過aeSearchNearestTimer函數獲取短的時間事件的執行時間間隔n,然后調用aeApiPoll函數獲取監聽到的套接字,最后執行與套接字向對應的事件處理函數rfileProc和wfileProc,最后再執行時間事件函數processTimeEvents
文件事件
Redis的基于Reactor模式開發了自己的網絡事件處理器,這個處理器被稱為文件事件處理器(file event handler):
文件事件處理器使用IO多路復用程序來監聽多個套接字,并根據套接字目前執行的任務為套接字關聯不同的事件處理器
當被監聽的套接字準備好執行連接應答(accept)、讀取(read)、寫入(write)、關閉(close)等操作,當文件事件產生時,這些文件事件處理器就會調用套接字之前關聯好的事件處理器來處理事件
文件事件處理器的構成
(學習視頻分享:redis視頻教程)
文件事件的處理器
Redis為文件事件編寫了多個處理器:
連接應答處理器:當Redis服務器進行初始化是,程序會將這個連接應答處理器和服務監聽套件字的AE_READABLE事件關聯起來,當有客戶端用connect函數連接服務器監聽套接字是,套接字就會產生AE_READABLE事件,引發連接應答處理器執行,并執行相應的套接字應答操作
命令請求處理器:當一個客戶端通過連接應答處理器成功連接到服務器之后,服務器會將客戶端套接字的AE_READABLE事件和命令請求處理器關聯起來,當客戶端向服務器發送命令請求時,套接字就會產生AE_READABLE事件,引發命令請求處理器執行,并執行相應的套接字讀入操作
命令回復處理器:當服務器有命令回復需要傳遞給客戶端時,服務端會將客戶端套接字的AE_WRITABLE事件和命令回復處理器關聯起來,當客戶端準備好接收服務器傳回的命令回復時,就會產生AE_WRITABLE事件,引發命令回復處理器執行,并執行相應的套接字寫入操作
一次完整的客戶端與服務端連接事件
服務器監聽套件字的AE_READABLE事件,當客戶端發送連接請求產生AE_READABLE事件,服務端會對客戶端的連接請求進行應答,將客戶端套接字的AE_READABLE事件與命令請求處理器關聯,客戶端可以向服務端發送命令請求了
客戶端向服務端發送一個命令請求,客戶端套接字將產生AE_READABLE事件,引發命令處理器去執行,執行命令將產生相應的命令回復,服務端將客戶端套接字的AE_WRITABLE事件與命令回復處理器關聯
客戶端嘗試讀取命令回復時,客戶端套接字將產生AE_WRITABLE事件,觸發命令回復處理器執行,當命令回復處理器將命令回復全部寫入套接字之后,服務器就會接觸客戶端套接字的AE_WRITABLE事件與命令回復處理器之間的關聯
時間事件
Redis的時間事件分為定時事件和周期性事件。一個時間事件由三個屬性組成:
id:服務器為時間時間創建的全局IDwhen:記錄了時間時間的到達時間(毫秒精度的UNIX時間戳)timeProc:時間事件處理器
服務器所有的時間事件都放在一個無序鏈表中,每當時間事件執行器運行時,它就遍歷整個鏈表,查找所有已到達的時間事件,并調用相應的事件處理器。正常模式下的Redis服務器只使用serverCron一個時間事件,而在benchmark模式下,服務器也只使用兩個時間事件,所以不影響事件執行的性能。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“redis事件處理流程的案例分析”這篇文章對大家有幫助,同時也希望大家多多支持創新互聯網站建設公司,,關注創新互聯行業資訊頻道,更多相關知識等著你來學習!