官方的解釋是,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的這個過程會阻塞。