Redis性能篇(一)Redis內部的阻塞式操做及應對方法

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主線程的關鍵路徑上的操做異步

上面的五個阻塞點中,是關鍵路徑操做的有:性能

  • 集合全量查詢和聚合操做;
  • 從庫加載RDB文件。

異步執行機制

下面咱們來了解一下異步執行機制。主線程經過一個鏈表形式的任務隊列和子線程進行交互,以下圖所示:學習

異步子線程執行機制

Redis主線程啓動後,會建立三個子線程來負責AOF日誌寫操做、鍵值對刪除以及文件關閉的異步執行。線程

異步的鍵值對刪除和數據庫清空操做是Redis 4.0後提供的功能,Redis也提供了新的命令來執行這兩個操做:日誌

  • 鍵值對刪除:當你的集合類型中有大量元素(例若有百萬級別或千萬級別元素)須要刪除時,我建議你使用UNLINK命令。
  • 清空數據庫:能夠在FLUSHDB和FLUSHALL命令後加上ASYNC選項,這樣就可讓後臺子線程異步地清空數據庫。例如:FLUSHDB ASYNCFLUSHALL AYSNC

建議

  • 集合全量查詢和聚合操做:可使用SCAN命令,分批讀取數據,再在客戶端進行聚合計算;
  • 從庫加載RDB文件:把主庫的數據量大小控制在2~4GB左右,以保證RDB文件能以較快的速度加載。

參考資料

相關文章
相關標籤/搜索