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

大雜草發表於2021-01-11

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 ASYNCFLUSHALL AYSNC

建議

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

參考資料

相關文章