redis為什么選擇單線程工作模型


1、先說一下為什么出現進程,線程

進程:在計算機發明之初就發現,在輸入數據時(I/O速度慢),CPU是空閑的,這樣就浪費了CPU資源,為了充分利用CPU資源,發明了進程,在輸入程序A的數據時,程序B在占用CPU資源進行計算。

線程:為了減少進程的上下文切換的損耗,滿足人機交互的實時性,同時保留進程充分利用CPU資源的優點,出現了線程。

2,redis為什么不用多線程(不划算唄)

(1)純內存操作;

(2)多線程仍然會有上下文切換的損耗,雖然比進程切換損耗小;

(3)采用了非阻塞I/O多路復用機制

題外話:我們現在要仔細的說一說I/O多路復用機制,因為這個說法實在是太通俗了,通俗到一般人都不懂是什么意思。博主打一個比方:小曲在S城開了一家快遞店,負責同城快送服務。小曲因為資金限制,雇佣了一批快遞員,然后小曲發現資金不夠了,只夠買一輛車送快遞。

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

  • 幾十個快遞員基本上時間都花在了搶車上了,大部分快遞員都處在閑置狀態,誰搶到了車,誰就能去送快遞
  • 隨着快遞的增多,快遞員也越來越多,小曲發現快遞店里越來越擠,沒辦法雇佣新的快遞員了
  • 快遞員之間的協調很花時間

綜合上述缺點,小曲痛定思痛,提出了下面的經營方式

經營方式二
小曲只雇佣一個快遞員。然后呢,客戶送來的快遞,小曲按送達地點標注好,然后依次放在一個地方。最后,那個快遞員依次的去取快遞,一次拿一個,然后開着車去送快遞,送好了就回來拿下一個快遞。

對比
上述兩種經營方式對比,是不是明顯覺得第二種,效率更高,更好呢。在上述比喻中:

  • 每個快遞員------------------>每個線程
  • 每個快遞-------------------->每個socket(I/O流)
  • 快遞的送達地點-------------->socket的不同狀態
  • 客戶送快遞請求-------------->來自客戶端的請求
  • 小曲的經營方式-------------->服務端運行的代碼
  • 一輛車---------------------->CPU的核數

於是我們有如下結論
1、經營方式一就是傳統的並發模型,每個I/O流(快遞)都有一個新的線程(快遞員)管理。
2、經營方式二就是I/O多路復用。只有單個線程(一個快遞員),通過跟蹤每個I/O流的狀態(每個快遞的送達地點),來管理多個I/O流。

下面類比到真實的redis線程模型,如圖所示

 

 

參照上圖,簡單來說,就是。我們的redis-client在操作的時候,會產生具有不同事件類型的socket。在服務端,有一段I/0多路復用程序,將其置入隊列之中。然后,文件事件分派器,依次去隊列中取,轉發到不同的事件處理器中。
需要說明的是,這個I/O多路復用機制,redis還提供了select、epoll、evport、kqueue等多路復用函數庫,大家可以自行去了解。

 

這通俗易懂的例子來自:https://www.cnblogs.com/rjzheng/p/9096228.html

推薦相關閱讀:http://www.cnblogs.com/huxiao-tee/p/4657851.html

 


免責聲明!

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



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