Redis中的IO多路複用機制
阿新 • • 發佈:2020-08-21
引言
提起Redis
,我們經常會說其底層是一個單執行緒模型,但這是不嚴謹的。Redis
單執行緒指的是網路請求模組使用了一個執行緒,即一個執行緒處理所有網路請求,其他模組仍用了多個執行緒。既然是單執行緒模型,那麼CPU
不是Redis
的瓶頸。Redis
的瓶頸最有可能是機器記憶體或者網路頻寬。
Redis中的單執行緒模型
Redis
基於Reactor
模式開發了自己的網路事件處理器,稱之為檔案事件處理器(File Event Hanlder
)。檔案事件處理器由Socket
、IO
多路複用程式、檔案事件分派器(dispather
),事件處理器(handler
)四部分組成。關於IO
多路複用的相關知識,這方面可以參考我之前的 一篇文章,這裡就不多解釋了。檔案事件處理器的模型如下所示:
IO
多路複用程式會同時監聽多個socket
,當被監聽的socket
準備好執行accept
、read
、write
、close
等操作時,與這些操作相對應的檔案事件就會產生。IO
多路複用程式會把所有產生事件的socket
壓入一個佇列中,然後有序地每次僅一個socket
的方式傳送給檔案事件分派器,檔案事件分派器接收到socket
之後會根據socket
產生的事件型別呼叫對應的事件處理器進行處理。
檔案事件處理器分為幾種:
- 連線應答處理器:用於處理客戶端的連線請求;
- 命令請求處理器:用於執行客戶端傳遞過來的命令,比如常見的
set
、lpush
等; - 命令回覆處理器:用於返回客戶端命令的執行結果,比如
set
、get
等命令的結果;
事件種類:
AE_READABLE
:與兩個事件處理器結合使用。- 當客戶端連線伺服器端時,伺服器端會將連線應答處理器與
socket
的AE_READABLE
事件關聯起來; - 當客戶端向服務端傳送命令的時候,伺服器端將命令請求處理器與
AE_READABLE
事件關聯起來;
- 當客戶端連線伺服器端時,伺服器端會將連線應答處理器與
AE_WRITABLE
:當服務端有資料需要回傳給客戶端時,服務端將命令回覆處理器與socket
的AE_WRITABLE
事件關聯起來。
Redis
的客戶端與服務端的互動過程如下所示: