Redis中的IO多路復用機制


引言

提起Redis,我們經常會說其底層是一個單線程模型,但這是不嚴謹的。Redis 單線程指的是網絡請求模塊使用了一個線程,即一個線程處理所有網絡請求,其他模塊該使用多線程,仍會使用了多個線程。既然是單線程模型,那么CPU不是Redis的瓶頸。Redis的瓶頸最有可能是機器內存或者網絡帶寬

Redis中的單線程模型

Redis基於Reactor模式開發了自己的網絡事件處理器,稱之為文件事件處理器(File Event Hanlder)。文件事件處理器由SocketIO多路復用程序、文件事件分派器(dispather),事件處理器(handler)四部分組成。關於IO多路復用的相關知識,這方面可以參考我之前的一篇文章,這里就不多解釋了。文件事件處理器的模型如下所示:

image-20200820212146572

IO多路復用程序會同時監聽多個socket,當被監聽的socket准備好執行acceptreadwriteclose等操作時,與這些操作相對應的文件事件就會產生。IO多路復用程序會把所有產生事件的socket壓入一個隊列中,然后有序地每次僅一個socket的方式傳送給文件事件分派器,文件事件分派器接收到socket之后會根據socket產生的事件類型調用對應的事件處理器進行處理。

文件事件處理器分為幾種:

  • 連接應答處理器:用於處理客戶端的連接請求;
  • 命令請求處理器:用於執行客戶端傳遞過來的命令,比如常見的setlpush等;
  • 命令回復處理器:用於返回客戶端命令的執行結果,比如setget等命令的結果;

事件種類:

  • AE_READABLE:與兩個事件處理器結合使用。
    • 當客戶端連接服務器端時,服務器端會將連接應答處理器與socketAE_READABLE事件關聯起來;
    • 當客戶端向服務端發送命令的時候,服務器端將命令請求處理器與AE_READABLE事件關聯起來;
  • AE_WRITABLE:當服務端有數據需要回傳給客戶端時,服務端將命令回復處理器與socketAE_WRITABLE事件關聯起來。

Redis的客戶端與服務端的交互過程如下所示:

image-20210917160156402

參考

Redis 為什么這么快?

Redis為什么是單線程?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM