redis的原理分析-Redis是單進程?性能爲何這麼快

Redis採用了一種很是簡單的作法,單線程來處理來自全部客戶端的併發請求,Redis把任務封閉在一個線程中從而 避免了線程安全問題;redis爲何是單線程?

 官方的解釋是,CPU並非Redis的瓶頸所在,Redis的瓶頸主要在機器的內存和網絡的帶寬。那麼Redis能不能處 理高併發請求呢?固然是能夠的,至於怎麼實現的,咱們來具體瞭解一下。 【注意併發不等於並行,併發性I/O 流,意味着可以讓一個計算單元來處理來自多個客戶端的流請求。並行性,意味着服務器可以同時執行幾個事情, 具備多個計算單元】redis

 多路複用 設計模式

Redis 是跑在單線程中的,全部的操做都是按照順序線性執行的,可是因爲讀寫操做等待用戶輸入或輸出都是阻塞 的,因此 I/O 操做在通常狀況下每每不能直接返回,這會致使某一文件的 I/O 阻塞致使整個進程沒法對其它客戶提 供服務,而 I/O 多路複用就是爲了解決這個問題而出現的。 安全

瞭解多路複用以前,先簡單瞭解下幾種I/O模型 服務器

(1)同步阻塞IO(Blocking IO):即傳統的IO模型。網絡

 (2)同步非阻塞IO(Non-blocking IO):默認建立的socket都是阻塞的,非阻塞IO要求socket被設置爲 NONBLOCK。多線程

 (3)IO多路複用(IO Multiplexing):即經典的Reactor設計模式,也稱爲異步阻塞IO,Java中的Selector和 Linux中的epoll都是這種模型。 併發

(4)異步IO(Asynchronous IO):即經典的Proactor設計模式,也稱爲異步非阻塞IO。異步

 同步和異步、阻塞和非阻塞,究竟是什麼意思,感受原理都差很少,我來簡單解釋一下 socket

同步和異步,指的是用戶線程和內核的交互方式高併發

 阻塞和非阻塞,指用戶線程調用內核IO操做的方式是阻塞仍是非阻塞 

就像在Java中使用多線程作異步處理的概念,經過多線程去執行一個流程,主線程能夠不用等待。

而阻塞和非阻塞 咱們能夠理解爲假如在同步流程或者異步流程中作IO操做,若是緩衝區數據還沒準備好,IO的這個過程會阻塞。 

相關文章
相關標籤/搜索