引言
提起
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
的用戶端與服務端的互動過程如下所示:
參考
Redis 為什麼這麼快?
Redis為什麼是單線程?