Redis被普遍使用的一個很重要的緣由是它的高性能。所以咱們必要要重視全部可能影響Redis性能的因素、機制以及應對方案。影響Redis性能的五大方面的潛在因素,分別是:html
這一講,咱們學習瞭解Redis內部的阻塞式操做以及應對方法。數據庫
Redis實例有哪些阻塞點
在分析阻塞點前,咱們先來看看和Redis實例交互的對象和操做有哪些:網絡
- 客戶端:網絡IO,鍵值對增刪改查操做,數據庫操做;
- 磁盤:生成RDB快照,記錄AOF日誌,AOF日誌重寫;
- 主從節點:主庫生成、傳輸RDB文件,從庫接收RDB文件、清空數據庫、加載RDB文件;
- 切片集羣實例:向其餘實例傳輸哈希槽信息,數據遷移。
這些交互操做可能會產生潛在的阻塞點。架構
阻塞點
- 集合全量查詢和聚合操做:要重視複雜度爲O(n)的操做。
- bigkey刪除:刪除操做的本質是要釋放鍵值對佔用的內存空間,一會兒釋放了大量內存,會形成Redis主線程的阻塞。
- 清空數據庫:頻繁刪除鍵值對是潛在風險,清空數據庫必然也是一個潛在風險。
- AOF日誌同步寫:一個同步寫磁盤的操做的耗時大約1~2ms,若是有大量寫操做須要記錄到AOF日誌並同步寫回,就會阻塞主線程。
- 從庫加載RDB文件:RDB文件越大,阻塞越久。
哪些阻塞操做能夠異步執行
異步執行對操做的要求:若是一個操做 有被異步執行,意味着它不是Redis主線程的關鍵路徑上的操做。異步
上面的五個阻塞點中,是關鍵路徑操做的有:性能
異步執行機制
下面咱們來了解一下異步執行機制。主線程經過一個鏈表形式的任務隊列和子線程進行交互,以下圖所示:學習

Redis主線程啓動後,會建立三個子線程來負責AOF日誌寫操做、鍵值對刪除以及文件關閉的異步執行。線程
異步的鍵值對刪除和數據庫清空操做是Redis 4.0後提供的功能,Redis也提供了新的命令來執行這兩個操做:日誌
- 鍵值對刪除:當你的集合類型中有大量元素(例若有百萬級別或千萬級別元素)須要刪除時,我建議你使用UNLINK命令。
- 清空數據庫:能夠在FLUSHDB和FLUSHALL命令後加上ASYNC選項,這樣就可讓後臺子線程異步地清空數據庫。例如:
FLUSHDB ASYNC
和FLUSHALL AYSNC
。
建議
- 集合全量查詢和聚合操做:可使用SCAN命令,分批讀取數據,再在客戶端進行聚合計算;
- 從庫加載RDB文件:把主庫的數據量大小控制在2~4GB左右,以保證RDB文件能以較快的速度加載。
參考資料