Redis被廣泛使用的一個很重要的原因是它的高性能,因此我們必要要重視所有可能影響Redis性能的因素、機制以及應對方案,影響Redis性能的五大方面的潛在因素,分別是:
- Redis內部的阻塞式操作
- CPU核和NUMA架構的影響
- Redis關鍵系統配置
- Redis記憶體碎片
- Redis緩沖區
本篇文章我們主要了解Redis內部的阻塞式操作以及應對方法,
Redis實體有哪些阻塞點
在分析阻塞點前,我們先來看看和Redis實體互動的物件和操作有哪些:
- 客戶端:網路IO,鍵值對增刪改查操作,資料庫操作;
- 磁盤:生成RDB快照,記錄AOF日志,AOF日志重寫;
- 主從節點:主庫生成、傳輸RDB檔案,從庫接收RDB檔案、清空資料庫、加載RDB檔案;
- 切片集群實體:向其他實體傳輸哈希槽資訊,資料遷移,
這些互動操作可能會產生潛在的阻塞點,
阻塞點
- 集合全量查詢和聚合操作:要重視復雜度為O(n)的操作,
- bigkey洗掉:洗掉操作的本質是要釋放鍵值對占用的記憶體空間,一下子釋放了大量記憶體,會造成Redis主執行緒的阻塞,
- 清空資料庫:頻繁洗掉鍵值對是潛在風險,清空資料庫必然也是一個潛在風險,
- AOF日志同步寫:一個同步寫磁盤的操作的耗時大約1~2ms,如果有大量寫操作需要記錄到AOF日志并同步寫回,就會阻塞主執行緒,
- 從庫加載RDB檔案:RDB檔案越大,阻塞越久,
哪些阻塞操作可以異步執行
異步執行對操作的要求:如果一個操作 有被異步執行,意味著它不是Redis主執行緒的關鍵路徑上的操作,
上面的五個阻塞點中,是關鍵路徑操作的有:
- 集合全量查詢和聚合操作;
- 從庫加載RDB檔案,
異步執行機制
下面我們來了解一下異步執行機制,主執行緒通過一個鏈表形式的任務佇列和子執行緒進行互動,如下圖所示:

Redis主執行緒啟動后,會創建三個子執行緒來負責AOF日志寫操作、鍵值對洗掉以及檔案關閉的異步執行,
異步的鍵值對洗掉和資料庫清空操作是Redis 4.0后提供的功能,Redis也提供了新的命令來執行這兩個操作:
- 鍵值對洗掉:當你的集合型別中有大量元素(例如有百萬級別或千萬級別元素)需要洗掉時,我建議你使用UNLINK命令,
- 清空資料庫:可以在FLUSHDB和FLUSHALL命令后加上ASYNC選項,這樣就可以讓后臺子執行緒異步地清空資料庫,例如:
FLUSHDB ASYNC和FLUSHALL AYSNC,
建議
- 集合全量查詢和聚合操作:可以使用SCAN命令,分批讀取資料,再在客戶端進行聚合計算;
- 從庫加載RDB檔案:把主庫的資料量大小控制在2~4GB左右,以保證RDB檔案能以較快的速度加載,
本文就寫到這了,有人看的話再抽時間寫一下后面四篇吧,
也許干巴巴的文字看起來有寫枯燥,如果單看文字不是很容易消化的話,可以進群973961276來跟大家一起交流學習,群里也有許多視頻資料和技術大牛,配合文章一起理解應該會讓你有不錯的識訓,
推薦一個不錯的c/c++ 初學者課程,這個跟以往所見到的只會空談理論的有所不同,這個課程是從六個可以寫在簡歷上的企業級專案入手帶領大家學習c/c++,正在學習的朋友可以了解一下,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/248641.html
標籤:其他
