Redis 官方在 2020 年 5 月正式推出 6.0 版本,提供很多振奮人心的新特性,所以備受關注。
❝碼老溼,提供了啥特性呀?知道了我能加薪麼?
主要特性如下:
-
多線程處理網絡 IO; -
客戶端緩存; -
細粒度權限控制(ACL); -
RESP3
協議的使用; -
用於複製的 RDB 文件不在有用,將立刻被刪除; -
RDB 文件加載速度更快;
其中備受關注的就是「多線程模型 + 客戶端緩存」,我們只有掌握了新特性原理,才能判斷什麼時候使用 6.0 版本,如何用的更好更快,不踩坑。
本篇先從 Redis 多線程模型開始
-
使用 Redis 時,幾乎不存在 CPU 成爲瓶頸的情況, Redis 主要受限於內存和網絡。 -
在一個普通的 Linux 系統上,Redis 通過使用 pipelining
每秒可以處理 100 萬個請求,所以如果應用程序主要使用 O(N) 或O(log(N)) 的命令,它幾乎不會佔用太多 CPU。 -
使用了單線程後,可維護性高。多線程模型雖然在某些方面表現優異,但是它卻引入了程序執行順序的不確定性,帶來了併發讀寫的一系列問題,增加了系統複雜度、同時可能存在線程切換、甚至加鎖解鎖、死鎖造成的性能損耗。
read/write
系統調用佔用了Redis 執行期間大部分CPU 時間,瓶頸主要在於網絡的 IO 消耗, 優化主要有兩個方向:
-
提高網絡 IO 性能,典型的實現比如使用 DPDK
來替代內核網絡棧的方式。 -
使用多線程充分利用多核,提高網絡請求讀寫的並行度,典型的實現比如 Memcached
。
-
主線程負責接收建立連接請求,獲取 socket
放入全局等待讀處理隊列; -
主線程通過輪詢將可讀 socket
分配給 IO 線程; -
主線程阻塞等待 IO 線程讀取 socket
完成; -
主線程執行 IO 線程讀取和解析出來的 Redis 請求命令; -
主線程阻塞等待 IO 線程將指令執行結果回寫回 socket
完畢; -
主線程清空全局隊列,等待客戶端後續的請求。
redis.conf
配置文件:
io-threads-do-reads yes
。
io-threads 4
總結與思考
-
優化網絡 I/O 模塊 -
提高機器內存讀寫的速度
-
零拷貝技術或者 DPDK 技術 -
利用多核優勢
Multi-Reactors/Master-Workers
模型。
有道無術,術可成;有術無道,止於術
歡迎大家關注Java之道公衆號
好文章,我在看❤️
本文分享自微信公衆號 - Hollis(hollischuang)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。