Redis服務器是一個事件驅動的程序,有以下兩類事件:
- 文件事件:Redis服務器通過套接字與客戶端或者其他的Redis服務器連接,而文件事件就是服務器套接字操作的抽象。與客戶端或者其它服務器通信産生相應的文件事件,服務器通過監聽處理這些事件來完成一系列的網絡通信操作。
- 時間事件:Redis服務器中的一些操作(如serverCron函數)需要在給定的時間點執行,而時間事件就是服務器對這類定時操作的抽象。
![讓人秒懂的redis的事件處理機制(圖解Redis-事件實現機制) 讓人秒懂的redis的事件處理機制(圖解Redis-事件實現機制)1](/uploads3/large/tos-cn-i-qvj2lq49k0/51798a265b3c4b0b8af6c6a00dac6cf6.jpg)
時間處理器結構
文件事件
Redis基于Reactor模式開發了自己的網絡事件處理器,利用IO多路複用程序來監聽套接字,當監聽到連接應答、讀取、寫入、關閉等操作是,就會調用對應關聯的事件處理器來處理。
文件事件處理器結構
![讓人秒懂的redis的事件處理機制(圖解Redis-事件實現機制) 讓人秒懂的redis的事件處理機制(圖解Redis-事件實現機制)2](/uploads3/large/tos-cn-i-qvj2lq49k0/c1dfd9a87ed44620b672650a9a81d3f1.jpg)
文件處理器結構
Redis的事件框架由:I/O多路複用程序、aeMain主線程、事件分派、事件隊列等幾個核心元素組成,aeMain主線程一直輪詢事件隊列中就緒的I/O事件,然後通過事件綁定的處理器來處理業務。
文件事件執行過程
![讓人秒懂的redis的事件處理機制(圖解Redis-事件實現機制) 讓人秒懂的redis的事件處理機制(圖解Redis-事件實現機制)3](/uploads3/large/tos-cn-i-qvj2lq49k0/0f10a54fdd784e2b9f5e6b5d52b762eb.jpg)
事件處理的過程
- 服務器接收到客戶端發送的建立連接請求
- 多路複用程序産生AE_READABLE事件發送至事件隊列
- 連接應答處理器接收到事件,開始創建socket并将AE_READABLE事件與命令請求處理器關聯,連接建立成功,等待接收客戶端後續操作
- 服務器接收到客戶端發送的命令請求
- 多路複用程序産生AE_READABLE事件,發送至事件隊列
- 命令請求處理器接收到事件,并從socket中讀取出命令信息并開始執行命令,同時将socket的AE_WRITABLE事件與命令回複處理器關聯
- 多路複用程序産生AE_WRITABLE事件,并發送至事件隊列
- 命令回複處理器接收到事件,開始向socket輸出本地操作的執行結果給客戶端,将socket的AE_WRITABLE事件與命令回複處理器解除關聯
時間事件
Redis的時間事件分為兩種,定時事件:讓一個函數在指定的時間之後執行一次;周期性任務:讓一個函數每間隔指定時間執行一次;時間事件是基于serverCron函數實現,該函數主要對服務器自身資源和狀态檢查和調整,确保服務器的長期、穩定運行,具體工作詳見本文中事件的調度執行。
事件的調度執行
![讓人秒懂的redis的事件處理機制(圖解Redis-事件實現機制) 讓人秒懂的redis的事件處理機制(圖解Redis-事件實現機制)4](/uploads3/large/tos-cn-i-qvj2lq49k0/51bfccb9432246b89fe361fd80ba7cd3.jpg)
事件的調度執行過程
- apiPoll函數阻塞并等待文件事件産生,該方法避免了服務器對時間事件進行頻繁的輪詢,該函數有阻塞過期,時間到達立即返回
- 文件事件的到達是随機的,随着文件事件的執行,時間事件的到達時間開始接近,當時間事件執行時間到達後服務器開始執行時間事件
- 文件事件與時間事件都是同步、有序、原子的執行的,整個過程盡量減少阻塞時間,耗時相對久的函數都會設置run_with_period(最大運行時長),當執行耗時比較久的函數時,Redis會采用子線程或子進程的方式來異步處理,比如持久化操作。
- Redis 6.0對processEvents流程進行了優化,引入多線程模型提升eventLoop 處理效率,詳見:Redis多線程處理模型
以上就是Redis事件實現機制的介紹,如果各位還想了解更多,歡迎轉發評論 關注,Redis圖解系列專欄持續更新中。
, 更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!