1. 介紹
Redis是基於reactor模式的一種事件驅動框架。
2. 事件分類
文件事件: 讀事件,寫事件
時間事件: 定時事件,週期性事件
3. 文件事件
連接事件:客戶端連接到服務端,連接關閉等
讀寫事件:socket讀寫
4.事件處理器
不同的事件對應不同的事件處理器,由事件分發器分派
說明:
IO多路複用一般藉助操作系統自帶的select或epoll等功能來實現
事件處理器包括請求處理器,回覆處理器,應答處理器等
5.文件事件的 源頭
文件事件是對套接字操作的抽象, 每當一個套接字準備好執行連接應答(accept)、寫入、讀取、關閉等操作時, 就會產生一個文件事件。 因爲一個服務器通常會連接多個套接字, 所以多個文件事件有可能會併發地出現。
6. redis出現阻塞的原因
I/O 多路複用程序負責監聽多個套接字, 並向文件事件分派器傳送那些產生了事件的套接字。
儘管多個文件事件可能會併發地出現, 但 I/O 多路複用程序總是會將所有產生事件的套接字都入隊到一個隊列裏面, 然後通過這個隊列, 以有序(sequentially)、同步(synchronously)、每次一個套接字的方式向文件事件分派器傳送套接字: 當上一個套接字產生的事件被處理完畢之後(該套接字爲事件所關聯的事件處理器執行完畢), I/O 多路複用程序纔會繼續向文件事件分派器傳送下一個套接字, 如圖 IMAGE_DISPATCH_EVENT_VIA_QUEUE 。
原因
1. redis採用單線程處理請求
2. reactor模型是同步IO,需要等待命令執行完成,纔會返回結果,然後進入下一次執行過程
3. 一旦某個客戶端的某個命令執行時間很長,就會阻塞其他客戶端