Redis 6 0 為什麼要引入多執行緒呢

2021-10-11 00:24:39 字數 1678 閱讀 7454

檢視 redis 版本

redis-cli -v

redis-cli 3.2.1

reactor 模式

redis 是基於 reactor 模式開發了網路事件處理器,這個處理器稱為檔案事件處理器。組成結構為4個部分:

一般來說 redis 的瓶頸並不在 cpu,而在記憶體和網路。如果要使用 cpu 多核,可以搭建多個 redis 例項來解決。

redis 的瓶頸並不在 cpu,而在記憶體和網路

記憶體不夠的話,可以加記憶體或者做資料結構優化和其他優化等,但網路的效能優化才是大頭,網路 io 的讀寫在 redis 整個執行期間占用了大部分的 cpu 時間,如果把網路處理這部分做成多執行緒處理方式,那對整個 redis 的效能會有很大的提公升。

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 完畢

解除繫結,清空等待佇列

該設計有如下特點:

不會,redis 的多執行緒部分只是用來處理網路資料的讀寫和協議解析,執行命令仍然是單執行緒順序執行。

redis 執行緒中經常提到 io 多路復用,如何理解?

這是 io 模型的一種,即經典的 reactor 設計模式,有時也稱為非同步阻塞 io。

多路指的是多個 socket 連線,復用指的是復用乙個執行緒。多路復用主要有三種技術:select,poll,epoll。

epoll 是最新的也是目前最好的多路復用技術。採用多路 i/o 復用技術可以讓單個執行緒高效的處理多個連線請求(儘量減少網路 io 的時間消耗),且 redis 在記憶體中運算元據的速度非常快(記憶體內的操作不會成為這裡的效能瓶頸),主要以上兩點造就了 redis 具有很高的吞吐量。

redis6.0與memcached多執行緒模型對比:

相同點:都採用了 master執行緒-worker 執行緒的模型

不同點:memcached 執行主邏輯也是在 worker 執行緒裡,模型更加簡單,實現了真正的執行緒隔離,符合我們對執行緒隔離的常規理解。而 redis 把處理邏輯交還給 master 執行緒,雖然一定程度上增加了模型複雜度,但也解決了執行緒併發安全等問題。

參考資料

Redis6 0為什麼引入多執行緒

reactor 模式的基本設計思想是基於i o復用模型來實現的。這裡說下i o復用模型。和傳統io多執行緒阻塞不同,i o復用模型中多個連線共用乙個阻塞物件,應用程式只需要在乙個阻塞物件等待。當某個連線有新的資料可以處理時,作業系統通知應用程式,執行緒從阻塞狀態返回,開始進行業務處理。什麼意思呢?餐...

為什麼要引入補碼

現在我們知道了計算機可以有三種編碼方式表示乙個數.對於正數因為三種編碼方式的結果都相同,所以不需要過多解釋 原碼 1 0000 0001 反碼 1 0000 0001 補碼 1 0000 0001 為了解決原碼做減法的問題,出現了反碼 1 1 1 1 0000 0001 原 1000 0001 原 ...

為什麼要引入註解

使用annotation之前 甚至在使用之後 xml被廣泛的應用於描述元資料。不知何時開始一些應用開發人員和架構師發現xml的維護越來越糟糕了。他們希望使用一些和 緊耦合的東西,而不是像xml那樣和 是松耦合的 在某些情況下甚至是完全分離的 描述。如果你在google中搜尋 xml vs.annot...