【Azure Redis 緩存】Azure Redis讀寫比較慢/卡的問題排查


問題描述

在使用Azure Redis的過程中發現讀寫比較慢,非常卡,執行擴容6-->13GB后,過一段時間也滿了。在通過門戶Console連接到Reids,通過info Memory名稱查看到User_memory_peak_perc指標達到99%以上,懷疑是不是該值的使用導致了Redis讀寫慢的問題呢?

 

問題根源

used_memory_peak_perc: 該值表示的是使用內存達到峰值內存的百分比。它的計算方式為:(used_memory/ used_memory_peak) * 100%,即當前redis使用內存/歷史使用記錄中redis使用內存峰值*100%。而used_memory_peak,表示的是redis的內存消耗峰值(以字節為單位),即歷史使用記錄中redis使用內存最高峰值。

 

所以used_memory_peak_perc指數高並不能判斷當前Redis的內容使用量。而如果需要判斷內存是否使用完,還是需要使用最基本的規則:MaxMemory Used_Memory進行大小比較

 

在Redis的使用中,另一個導致慢的關鍵點是執行一些時間復雜度為O(N)的指令,如KEYSHGETALL等,可以執行slowlog來查看Redis執行的慢查詢日志。

  • KEYS:Returns all keys matching pattern. While the time complexity for this operation is O(N), the constant times are fairly low. 
  • HGETALL命令,而該命令的時間復雜度是O(N) , 這意味着Hash的field越多,當使用HgetAll獲取全量數據時,性能越差,該命令的性能與field字段的數量成正比。如果頻繁使用,是非常耗時的。

 

解決辦法

升級Redis的內存空間,及設置合理的maxmemory-policy(逐出機制)。當redis內存數據達到maxmemory時,會根據maxmemory-policy配置來淘汰內存數據,以避免內存溢出(OOM: Out of Memory)。redis提供了以下8種淘汰策略:

  • volatile-lru :通過嘗試先刪除最近不使用的(LRU)密鑰來移出密鑰,但只有在已設置過期的密鑰中才能移出這些密鑰,以便為添加的新數據騰出空間。如果查找不到數據,則回退到noeviction。
  • allkeys-lru:通過嘗試先刪除最近不使用的(LRU)鍵來移出鍵(所有數據范圍),以便為添加的新數據騰出空間。
  • volatile-random:為添加新的鍵騰出空間,隨機逐出其他鍵,但是僅逐出設置了過期時間的鍵。
  • allkeys-random:隨機逐出其他鍵,以便為添加新的鍵騰出空間(所有數據范圍)。
  • volatile-ttl:逐出設置過期的密鑰,並嘗試首先逐出具有較短生存時間(TTL)的密鑰,以便為添加新的鍵騰出空間。
  • noeviction:執行任何淘汰策略。當達到內存限制並且客戶端嘗試執行可能導致使用更多內存的命令時,將返回錯誤(大多數寫入命令,但DEL和一些其他例外)。
  • volatile-lfu:使用設置過期並且使用頻率最少的鍵(LFU)中進行驅逐。
  • allkeys-lfu:使用頻率最少的鍵(LFU)逐出任何密鑰。

參考資料

Redis Commands reference: https://redis.io/commands/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM