1. 程式人生 > 實用技巧 >Redis中的IO多路複用機制

Redis中的IO多路複用機制

引言

提起Redis,我們經常會說其底層是一個單執行緒模型,但這是不嚴謹的。Redis 單執行緒指的是網路請求模組使用了一個執行緒,即一個執行緒處理所有網路請求,其他模組仍用了多個執行緒。既然是單執行緒模型,那麼CPU不是Redis的瓶頸。Redis的瓶頸最有可能是機器記憶體或者網路頻寬

Redis中的單執行緒模型

Redis基於Reactor模式開發了自己的網路事件處理器,稱之為檔案事件處理器(File Event Hanlder)。檔案事件處理器由SocketIO多路複用程式、檔案事件分派器(dispather),事件處理器(handler)四部分組成。關於IO多路複用的相關知識,這方面可以參考我之前的

一篇文章,這裡就不多解釋了。檔案事件處理器的模型如下所示:

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

檔案事件處理器分為幾種:

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

事件種類:

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

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

參考

Redis 為什麼這麼快?

Redis為什麼是單執行緒?