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)化,并沒有針對嚴謹?shù)难訒r控制和不同并發(fā)的場景進行壓測。數(shù)據(jù)僅供驗證參考而不能作為線上指標,且只是目前的
          unstble分支的性能,不排除后續(xù)發(fā)布的正式版本的性能會更好。
          Redis 6.0 之前的版本真的是單線程嗎?


          Redis基于Reactor模式開發(fā)了網(wǎng)絡事件處理器,這個處理器被稱為文件事件處理器。它的組成結(jié)構(gòu)為4部分:多個套接字、IO多路復用程序、文件事件分派器、事件處理器。
          因為文件事件分派器隊列的消費是單線程的,所以Redis才叫單線程模型。



          ?

          ?

          ?

          一般來說 Redis 的瓶頸并不在 CPU,而在內(nèi)存和網(wǎng)絡。如果要使用 CPU 多核,可以搭建多個 Redis 實例來解決。

          其實,Redis 4.0 開始就有多線程的概念了,比如 Redis 通過多線程方式在后臺刪除對象、以及通過 Redis 模塊實現(xiàn)的阻塞命令等。

          ?

          Redis 6.0 之前為什么一直不使用多線程?


          使用了單線程后,可維護性高。多線程模型雖然在某些方面表現(xiàn)優(yōu)異,但是它卻引入了程序執(zhí)行順序的不確定性,帶來了并發(fā)讀寫的一系列問題,增加了系統(tǒng)復雜度、同時可能存在線程切換、甚至加鎖解鎖、死鎖造成的性能損耗。

          Redis 通過 AE 事件模型以及 IO 多路復用等技術(shù),處理性能非常高,因此沒有必要使用多線程。

          單線程機制使得 Redis 內(nèi)部實現(xiàn)的復雜度大大降低,Hash 的惰性 Rehash、Lpush 等等 “線程不安全” 的命令都可以無鎖進行。

          Redis 6.0 為什么要引入多線程呢?

          之前的段落說了,Redis 的瓶頸并不在 CPU,而在內(nèi)存和網(wǎng)絡。

          內(nèi)存不夠的話,可以加內(nèi)存或者做數(shù)據(jù)結(jié)構(gòu)優(yōu)化和其他優(yōu)化等,但網(wǎng)絡的性能優(yōu)化才是大頭,網(wǎng)絡 IO 的讀寫在 Redis 整個執(zhí)行期間占用了大部分的 CPU
          時間,如果把網(wǎng)絡處理這部分做成多線程處理方式,那對整個 Redis 的性能會有很大的提升。

          優(yōu)化方向:

          * 提高網(wǎng)絡 IO 性能,典型的實現(xiàn)比如使用 DPDK 來替代內(nèi)核網(wǎng)絡棧的方式。
          * 使用多線程充分利用多核,典型的實現(xiàn)比如 Memcached。
          所以總結(jié)起來,Redis 支持多線程主要就是兩個原因:

          * 可以充分利用服務器 CPU 資源,目前主線程只能利用一個核。
          * 多線程任務可以分攤 Redis 同步 IO 讀寫負荷。
          Redis 6.0 默認是否開啟了多線程?

          否,在conf文件進行配置

          io-threads-do-reads yes

          io-threads 線程數(shù)

          官方建議:4 核的機器建議設(shè)置為 2 或 3 個線程,8 核的建議設(shè)置為 6 個線程,線程數(shù)一定要小于機器核數(shù),盡量不超過8個。

          Redis 6.0 多線程的實現(xiàn)機制?



          ?

          ?

          流程簡述如下:

          * 主線程負責接收建立連接請求,獲取 Socket 放入全局等待讀處理隊列。
          * 主線程處理完讀事件之后,通過 RR(Round Robin)將這些連接分配給這些 IO 線程。
          * 主線程阻塞等待 IO 線程讀取 Socket 完畢。
          * 主線程通過單線程的方式執(zhí)行請求命令,請求數(shù)據(jù)讀取并解析完成,但并不執(zhí)行。
          * 主線程阻塞等待 IO 線程將數(shù)據(jù)回寫 Socket 完畢。
          * 解除綁定,清空等待隊列。


          ?

          ?

          該設(shè)計有如下特點:

          * IO 線程要么同時在讀 Socket,要么同時在寫,不會同時讀或?qū)憽?
          * IO 線程只負責讀寫 Socket 解析命令,不負責命令處理。
          開啟多線程后,是否會存在線程并發(fā)安全問題?

          不會,Redis 的多線程部分只是用來處理網(wǎng)絡數(shù)據(jù)的讀寫和協(xié)議解析,執(zhí)行命令仍然是單線程順序執(zhí)行。

          Redis 線程中經(jīng)常提到 IO 多路復用,如何理解?

          這是 IO 模型的一種,即經(jīng)典的 Reactor 設(shè)計模式,有時也稱為異步阻塞 IO。



          ?

          ?

          多路指的是多個 Socket 連接,復用指的是復用一個線程。多路復用主要有三種技術(shù):Select,Poll,Epoll。

          Epoll 是最新的也是目前最好的多路復用技術(shù)。采用多路 I/O 復用技術(shù)可以讓單個線程高效的處理多個連接請求(盡量減少網(wǎng)絡 IO 的時間消耗),且
          Redis 在內(nèi)存中操作數(shù)據(jù)的速度非??欤▋?nèi)存內(nèi)的操作不會成為這里的性能瓶頸),主要以上兩點造就了 Redis 具有很高的吞吐量。

          暫時就到這里了,部分數(shù)據(jù)來源網(wǎng)絡,僅做參考。

          友情鏈接
          ioDraw流程圖
          API參考文檔
          OK工具箱
          云服務器優(yōu)惠
          阿里云優(yōu)惠券
          騰訊云優(yōu)惠券
          京東云優(yōu)惠券
          站點信息
          問題反饋
          郵箱:[email protected]
          QQ群:637538335
          關(guān)注微信

                精品国自产在线观看 | 男女黄床上色视频免费的小说 | 性生交大片免费看无遮挡网站 | 国产精品电影一区 | 久久熟女少妇 |