redis 多线程_Java架构师Redis单线程?别逗了,Redis6.0多线程重磅来袭
2019年的 RedisConf 比以往時候來的更早一些,今年會議時間是4月1-3號,仍然是在舊金山魚人碼頭Pier 27。恰逢今年是 Redis 第10周年,規模也比以往大一些,注冊人數超過1600人,總共有80個議題,除了RedisLabs外還有很多云廠商和Redis用戶帶來分享。Redis 作者 antirez 在 RedisConf 2019 做了分享,其中一段展示了 Redis 6 引入的多線程 IO 特性對性能提升至少是一倍以上。
無獨有偶,在之前 antirez 的博客上,我們已經提前知道了這個消息:
多線程實現
目前對于單線程 Redis 來說,性能瓶頸主要在于網絡的 IO 消耗, 優化主要有兩個方向:
提高網絡 IO 性能,典型的實現像使用 DPDK 來替代內核網絡棧的方式
使用多線程充分利用多核,典型的實現像 Memcached
多線程特性在社區也被反復提了很久后,Redis作者antirez終于在 Redis 6 加入多線程。
因為讀寫網絡的read/write系統調用在Redis執行期間占用了大部分CPU時間,如果把網絡讀寫做成多線程的方式對性能會有很大提升。現在已經實現了第一版,write side即回復客戶端這部分已經完成了,并且去掉了主線程和IO線程之間的互斥鎖,采用busy loop的形式來等待io線程工作結束,這部分能夠有50%的性能提升,架構圖如下:
Redis 的多線程部分只是用來處理網絡數據的讀寫和協議解析,執行命令仍然是單線程。之所以這么設計是不想 Redis 因為多線程而變得復雜,需要去控制 key、lua、事務,LPUSH/LPOP 等等的并發問題。
多線程 IO 的讀(請求)和寫(響應)在實現流程是一樣的,只是執行讀還是寫操作的差異。同時這些 IO 線程在同一時刻全部是讀或者寫,不會部分讀或部分寫的情況,所以下面以讀流程作為例子。分析過程中只會覆蓋核心邏輯而不是全部細節。如果想完全理解細節,建議看完之后再次看一次源碼實現。
加入多線程 IO 之后,整體的讀流程如下:
主線程負責接收建連請求,讀事件到來(收到請求)則放到一個全局等待讀處理隊列
主線程處理完讀事件之后,通過 RR(Round Robin) 將這些連接分配給這些 IO 線程,然后主線程忙等待(spinlock 的效果)狀態
IO 線程將請求數據讀取并解析完成(這里只是讀數據和解析并不執行)
主線程執行所有命令并清空整個請求等待讀處理隊列(執行部分串行)
上面的這個過程是完全無鎖的,因為在 IO 線程處理的時主線程會等待全部的 IO 線程完成,所以不會出現data race的場景。
性能對比
壓測配置:
Redis Server: 阿里云 Ubuntu 18.04,8 CPU 2.5 GHZ, 8G 內存,主機型號 ecs.ic5.2xlargeRedis Benchmark Client: 阿里云 Ubuntu 18.04,8 2.5 GHZ CPU, 8G 內存,主機型號 ecs.ic5.2xlarge
多線程 IO 版本剛合并到 unstable 分支一段時間,所以只能使用 unstable 分支來測試多線程 IO,單線程版本是 Redis 5.0.5。多線程 IO 版本需要新增以下配置:
io-threads 4 # 開啟 4 個 IO 線程io-threads-do-reads yes # 請求解析也是用 IO 線程
壓測命令:
redis-benchmark -h 192.168.0.49 -a foobared -t set,get -n 1000000 -r 100000000 --threads 4 -d ${datasize} -c 256從上面可以看到 GET/SET 命令在 4 線程 IO 時性能相比單線程是幾乎是翻倍了。另外,這些數據只是為了簡單驗證多線程 IO 是否真正帶來性能優化,并沒有針對嚴謹的延時控制和不同并發的場景進行壓測。數據僅供驗證參考而不能作為線上指標,且只是目前的 unstble分支的性能,不排除后續發布的正式版本的性能會更好。
總結
Redis 6.0 預計會在 2019 年底發布,將在性能、協議以及權限控制都會有很大的改進。antirez 今年全身心投入在優化 Redis 和集群的功能,特別值得期待。另外,今年年底社區也會同時發布第一個版本 redis cluster proxy 來解決多語言 SDK 兼容的問題,期待在具備 proxy 功能之后 cluster 能在國內有更加廣泛的應用。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的redis 多线程_Java架构师Redis单线程?别逗了,Redis6.0多线程重磅来袭的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不用QQ也能电脑远程电脑不用qq怎么远程
- 下一篇: 如何用电脑向手机客户群发短信如何用电脑发