做者Antirez在RC1版本發佈時在他的博客寫下:redis
the most 「enterprise」 Redis version to date // 最」企業級」的設計模式
the largest release of Redis ever as far as I can tell // 最大的安全
the one where the biggest amount of people participated // 參與人數最多的性能優化
先po出新版和舊版性能圖服務器
Redis基於Reactor模式開發了網絡事件處理器,這個處理器被稱爲文件事件處理器。它的組成結構爲4部分:多個套接字、IO多路複用程序、文件事件分派器、事件處理器。由於文件事件分派器隊列的消費是單線程的,因此Redis才叫單線程模型。網絡
通常來講 Redis 的瓶頸並不在 CPU,而在內存和網絡。若是要使用 CPU 多核,能夠搭建多個 Redis 實例來解決。數據結構
其實,Redis 4.0 開始就有多線程的概念了,好比 Redis 經過多線程方式在後臺刪除對象、以及經過 Redis 模塊實現的阻塞命令等。多線程
使用了單線程後,可維護性高。多線程模型雖然在某些方面表現優異,可是它卻引入了程序執行順序的不肯定性,帶來了併發讀寫的一系列問題,增長了系統複雜度、同時可能存在線程切換、甚至加鎖解鎖、死鎖形成的性能損耗。併發
Redis 經過 AE 事件模型以及 IO 多路複用等技術,處理性能很是高,所以沒有必要使用多線程。異步
單線程機制使得 Redis 內部實現的複雜度大大下降,Hash 的惰性 Rehash、Lpush 等等 「線程不安全」 的命令均可以無鎖進行。
以前的段落說了,Redis 的瓶頸並不在 CPU,而在內存和網絡。
內存不夠的話,能夠加內存或者作數據結構優化和其餘優化等,但網絡的性能優化纔是大頭,網絡 IO 的讀寫在 Redis 整個執行期間佔用了大部分的 CPU 時間,若是把網絡處理這部分作成多線程處理方式,那對整個 Redis 的性能會有很大的提高。
優化方向:
因此總結起來,Redis 支持多線程主要就是兩個緣由:
否,在conf文件進行配置
io-threads-do-reads yes
io-threads 線程數
官方建議:4 核的機器建議設置爲 2 或 3 個線程,8 核的建議設置爲 6 個線程,線程數必定要小於機器核數,儘可能不超過8個。
流程簡述以下:
該設計有以下特色:
不會,Redis 的多線程部分只是用來處理網絡數據的讀寫和協議解析,執行命令仍然是單線程順序執行。
這是 IO 模型的一種,即經典的 Reactor 設計模式,有時也稱爲異步阻塞 IO。
多路指的是多個 Socket 鏈接,複用指的是複用一個線程。多路複用主要有三種技術:Select,Poll,Epoll。
Epoll 是最新的也是目前最好的多路複用技術。採用多路 I/O 複用技術可讓單個線程高效的處理多個鏈接請求(儘可能減小網絡 IO 的時間消耗),且 Redis 在內存中操做數據的速度很是快(內存內的操做不會成爲這裏的性能瓶頸),主要以上兩點造就了 Redis 具備很高的吞吐量。
暫時就到這裏了,部分數據來源網絡,僅作參考。