Redis 6.0 多線程重磅發佈!!!

Redis 6.0在5.2號這個美好的日子裏悄無聲息的發佈了,此次發佈在IT圈猶如一顆驚雷通常,由於這是redis最大的一次改版,首次加入了多線程

做者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出新版和舊版性能圖服務器

 

 

 

 

從上面能夠看到 GET/SET 命令在 4 線程 IO 時性能相比單線程是幾乎是翻倍了。另外,這些數據只是爲了簡單驗證多線程 IO 是否真正帶來性能優化,並無針對嚴謹的延時控制和不一樣併發的場景進行壓測。數據僅供驗證參考而不能做爲線上指標,且只是目前的 unstble分支的性能,不排除後續發佈的正式版本的性能會更好。

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 具備很高的吞吐量。

暫時就到這裏了,部分數據來源網絡,僅作參考。

相關文章
相關標籤/搜索