天天看點

Redis中的IO多路複用機制

引言

提起

Redis

,我們經常會說其底層是一個單線程模型,但這是不嚴謹的。

Redis

單線程指的是網絡請求子產品使用了一個線程,即一個線程處理所有網絡請求,其他子產品該使用多線程,仍會使用了多個線程。既然是單線程模型,那麼

CPU

不是

Redis

的瓶頸。

Redis

的瓶頸最有可能是機器記憶體或者網絡帶寬。

Redis中的單線程模型

Redis

基于

Reactor

模式開發了自己的網絡事件處理器,稱之為檔案事件處理器(

File Event Hanlder

)。檔案事件處理器由

Socket

IO

多路複用程式、檔案事件分派器(

dispather

),事件處理器(

handler

)四部分組成。關于

IO

多路複用的相關知識,這方面可以參考我之前的一篇文章,這裡就不多解釋了。檔案事件處理器的模型如下所示:

Redis中的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中的IO多路複用機制

參考

Redis 為什麼這麼快?

Redis為什麼是單線程?