引言
提起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
的客戶端與服務端的交互過程如下所示: