1. 程式人生 > >redis 多路複用原理

redis 多路複用原理

仔細說一說 I/O 多路複用機制,打一個比方:小曲在 S 城開了一家快遞店,負責同城快送服務。小曲因為資金限制,僱傭了一批快遞員,然後小曲發現資金不夠了,只夠買一輛車送快遞。

 

經營方式一

客戶每送來一份快遞,小曲就讓一個快遞員盯著,然後快遞員開車去送快遞。慢慢的小曲就發現了這種經營方式存在下述問題:

  • 時間都花在了搶車上了,大部分快遞員都處在閒置狀態,搶到車才能去送快遞。

  • 隨著快遞的增多,快遞員也越來越多,小曲發現快遞店裡越來越擠,沒辦法僱傭新的快遞員了。

  • 快遞員之間的協調很花時間。

 

綜合上述缺點,小曲痛定思痛,提出了經營方式二。

 

經營方式二

小曲只僱傭一個快遞員。當客戶送來快遞,小曲按送達地點標註好,依次放在一個地方。最後,讓快遞員依次去取快遞,一次拿一個,再開著車去送快遞,送好了就回來拿下一個快遞。上述兩種經營方式對比,很明顯第二種效率更高。

 

在上述比喻中:

  • 每個快遞員→每個執行緒

  • 每個快遞→每個 Socket(I/O 流)

  • 快遞的送達地點→Socket 的不同狀態

  • 客戶送快遞請求→來自客戶端的請求

  • 小曲的經營方式→服務端執行的程式碼

  • 一輛車→CPU 的核數

於是有了如下結論:

  • 經營方式一就是傳統的併發模型,每個 I/O 流(快遞)都有一個新的執行緒(快遞員)管理。

  • 經營方式二就是 I/O 多路複用。只有單個執行緒(一個快遞員),通過跟蹤每個 I/O 流的狀態(每個快遞的送達地點),來管理多個 I/O 流。

 

下面類比到真實的 Redis 執行緒模型,如圖所示:

 

Redis-client 在操作的時候,會產生具有不同事件型別的 Socket。在服務端,有一段 I/O 多路複用程式,將其置入佇列之中。然後,檔案事件分派器,依次去佇列中取,轉發到不同的事件處理器中。