Redis 6.0在5.2號這個美好的日子裡悄無聲息的釋出了,這次釋出在IT圈猶如一顆驚雷一般,因為這是redis最大的一次改版,首次加入了多執行緒。
作者Antirez在RC1版本釋出時在他的部落格寫下:
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 6.0 之前的版本真的是單執行緒嗎?
Redis基於Reactor模式開發了網路事件處理器,這個處理器被稱為檔案事件處理器。它的組成結構為4部分:多個套接字、IO多路複用程式、檔案事件分派器、事件處理器。因為檔案事件分派器佇列的消費是單執行緒的,所以Redis才叫單執行緒模型。
一般來說 Redis 的瓶頸並不在 CPU,而在記憶體和網路。如果要使用 CPU 多核,可以搭建多個 Redis 例項來解決。
其實,Redis 4.0 開始就有多執行緒的概念了,比如 Redis 通過多執行緒方式在後臺刪除物件、以及通過 Redis 模組實現的阻塞命令等。
Redis 6.0 之前為什麼一直不使用多執行緒?
使用了單執行緒後,可維護性高。多執行緒模型雖然在某些方面表現優異,但是它卻引入了程式執行順序的不確定性,帶來了併發讀寫的一系列問題,增加了系統複雜度、同時可能存線上程切換、甚至加鎖解鎖、死鎖造成的效能損耗。
Redis 通過 AE 事件模型以及 IO 多路複用等技術,處理效能非常高,因此沒有必要使用多執行緒。
單執行緒機制使得 Redis 內部實現的複雜度大大降低,Hash 的惰性 Rehash、Lpush 等等 “執行緒不安全” 的命令都可以無鎖進行。
Redis 6.0 為什麼要引入多執行緒呢?
之前的段落說了,Redis 的瓶頸並不在 CPU,而在記憶體和網路。
記憶體不夠的話,可以加記憶體或者做資料結構優化和其他優化等,但網路的效能優化才是大頭,網路 IO 的讀寫在 Redis 整個執行期間佔用了大部分的 CPU 時間,如果把網路處理這部分做成多執行緒處理方式,那對整個 Redis 的效能會有很大的提升。
優化方向:
- 提高網路 IO 效能,典型的實現比如使用 DPDK 來替代核心網路棧的方式。
- 使用多執行緒充分利用多核,典型的實現比如 Memcached。
所以總結起來,Redis 支援多執行緒主要就是兩個原因:
- 可以充分利用伺服器 CPU 資源,目前主執行緒只能利用一個核。
- 多執行緒任務可以分攤 Redis 同步 IO 讀寫負荷。
Redis 6.0 預設是否開啟了多執行緒?
否,在conf檔案進行配置
io-threads-do-reads yes
io-threads 執行緒數
官方建議:4 核的機器建議設定為 2 或 3 個執行緒,8 核的建議設定為 6 個執行緒,執行緒數一定要小於機器核數,儘量不超過8個。
Redis 6.0 多執行緒的實現機制?
流程簡述如下:
- 主執行緒負責接收建立連線請求,獲取 Socket 放入全域性等待讀處理佇列。
- 主執行緒處理完讀事件之後,通過 RR(Round Robin)將這些連線分配給這些 IO 執行緒。
- 主執行緒阻塞等待 IO 執行緒讀取 Socket 完畢。
- 主執行緒通過單執行緒的方式執行請求命令,請求資料讀取並解析完成,但並不執行。
- 主執行緒阻塞等待 IO 執行緒將資料回寫 Socket 完畢。
- 解除繫結,清空等待佇列。
該設計有如下特點:
- IO 執行緒要麼同時在讀 Socket,要麼同時在寫,不會同時讀或寫。
- IO 執行緒只負責讀寫 Socket 解析命令,不負責命令處理。
開啟多執行緒後,是否會存線上程併發安全問題?
不會,Redis 的多執行緒部分只是用來處理網路資料的讀寫和協議解析,執行命令仍然是單執行緒順序執行。
Redis 執行緒中經常提到 IO 多路複用,如何理解?
這是 IO 模型的一種,即經典的 Reactor 設計模式,有時也稱為非同步阻塞 IO。
多路指的是多個 Socket 連線,複用指的是複用一個執行緒。多路複用主要有三種技術:Select,Poll,Epoll。
Epoll 是最新的也是目前最好的多路複用技術。採用多路 I/O 複用技術可以讓單個執行緒高效的處理多個連線請求(儘量減少網路 IO 的時間消耗),且 Redis 在記憶體中運算元據的速度非常快(記憶體內的操作不會成為這裡的效能瓶頸),主要以上兩點造就了 Redis 具有很高的吞吐量。
暫時就到這裡了,部分資料來源網路,僅做參考。