Redis 6.0在5.2號這個美好的日子里悄無聲息的發(fā)布了,,這次發(fā)布在IT圈猶如一顆驚雷一般,,因為這是redis最大的一次改版,首次加入了多線程,。作者Antirez在RC1版本發(fā)布時在他的博客寫下: the most “enterprise” Redis version to date // 最”企業(yè)級”的 the largest release of Redis ever as far as I can tell // 最大的 the one where the biggest amount of people participated // 參與人數(shù)最多的 這次改變,,性能有個飛速的提升~先po出新版和舊版性能圖 從上面可以看到 GET/SET 命令在 4 線程 IO 時性能相比單線程是幾乎是翻倍了。另外,,這些數(shù)據(jù)只是為了簡單驗證多線程 IO 是否真正帶來性能優(yōu)化,,并沒有針對嚴(yán)謹(jǐn)?shù)难訒r控制和不同并發(fā)的場景進(jìn)行壓測。數(shù)據(jù)僅供驗證參考而不能作為線上指標(biāo),,且只是目前的 unstble分支的性能,,不排除后續(xù)發(fā)布的正式版本的性能會更好。 Redis 6.0 之前的版本真的是單線程嗎,?Redis基于Reactor模式開發(fā)了網(wǎng)絡(luò)事件處理器,,這個處理器被稱為文件事件處理器,。它的組成結(jié)構(gòu)為4部分:多個套接字、IO多路復(fù)用程序,、文件事件分派器,、事件處理器。因為文件事件分派器隊列的消費是單線程的,,所以Redis才叫單線程模型,。 一般來說 Redis 的瓶頸并不在 CPU,而在內(nèi)存和網(wǎng)絡(luò),。如果要使用 CPU 多核,,可以搭建多個 Redis 實例來解決。 其實,,Redis 4.0 開始就有多線程的概念了,,比如 Redis 通過多線程方式在后臺刪除對象、以及通過 Redis 模塊實現(xiàn)的阻塞命令等,。 Redis 6.0 之前為什么一直不使用多線程,?使用了單線程后,可維護(hù)性高,。多線程模型雖然在某些方面表現(xiàn)優(yōu)異,,但是它卻引入了程序執(zhí)行順序的不確定性,帶來了并發(fā)讀寫的一系列問題,,增加了系統(tǒng)復(fù)雜度,、同時可能存在線程切換、甚至加鎖解鎖,、死鎖造成的性能損耗,。 Redis 通過 AE 事件模型以及 IO 多路復(fù)用等技術(shù),處理性能非常高,,因此沒有必要使用多線程,。 單線程機制使得 Redis 內(nèi)部實現(xiàn)的復(fù)雜度大大降低,Hash 的惰性 Rehash,、Lpush 等等 “線程不安全” 的命令都可以無鎖進(jìn)行,。 Redis 6.0 為什么要引入多線程呢?之前的段落說了,,Redis 的瓶頸并不在 CPU,,而在內(nèi)存和網(wǎng)絡(luò)。 內(nèi)存不夠的話,,可以加內(nèi)存或者做數(shù)據(jù)結(jié)構(gòu)優(yōu)化和其他優(yōu)化等,,但網(wǎng)絡(luò)的性能優(yōu)化才是大頭,網(wǎng)絡(luò) IO 的讀寫在 Redis 整個執(zhí)行期間占用了大部分的 CPU 時間,如果把網(wǎng)絡(luò)處理這部分做成多線程處理方式,,那對整個 Redis 的性能會有很大的提升,。 優(yōu)化方向:
所以總結(jié)起來,,Redis 支持多線程主要就是兩個原因:
Redis 6.0 默認(rèn)是否開啟了多線程,?否,在conf文件進(jìn)行配置 io-threads-do-reads yes io-threads 線程數(shù) 官方建議:4 核的機器建議設(shè)置為 2 或 3 個線程,,8 核的建議設(shè)置為 6 個線程,,線程數(shù)一定要小于機器核數(shù),盡量不超過8個,。 Redis 6.0 多線程的實現(xiàn)機制,?流程簡述如下:
該設(shè)計有如下特點:
開啟多線程后,是否會存在線程并發(fā)安全問題,?不會,Redis 的多線程部分只是用來處理網(wǎng)絡(luò)數(shù)據(jù)的讀寫和協(xié)議解析,,執(zhí)行命令仍然是單線程順序執(zhí)行,。 Redis 線程中經(jīng)常提到 IO 多路復(fù)用,如何理解,?這是 IO 模型的一種,,即經(jīng)典的 Reactor 設(shè)計模式,,有時也稱為異步阻塞 IO。 多路指的是多個 Socket 連接,,復(fù)用指的是復(fù)用一個線程,。多路復(fù)用主要有三種技術(shù):Select,Poll,,Epoll,。 Epoll 是最新的也是目前最好的多路復(fù)用技術(shù)。采用多路 I/O 復(fù)用技術(shù)可以讓單個線程高效的處理多個連接請求(盡量減少網(wǎng)絡(luò) IO 的時間消耗),,且 Redis 在內(nèi)存中操作數(shù)據(jù)的速度非??欤▋?nèi)存內(nèi)的操作不會成為這里的性能瓶頸),主要以上兩點造就了 Redis 具有很高的吞吐量,。 暫時就到這里了,,部分?jǐn)?shù)據(jù)來源網(wǎng)絡(luò),僅做參考,。 來源:https://www./content-2-695051.html |
|