除了手動清理,Redi還有哪些回收策略?

Redis內存回收機制主要體如今如下兩個方面:算法

  • 刪除到達時間的鍵對象。
  • 內存使用達到maxmemory上限時觸發內存溢出控制策略。

刪除過時鍵對象

Redis全部的鍵均可以設置過時屬性,內部保存在過時字典中。因爲進程內保存了大量的鍵,維護每一個鍵精準的過時刪除機制會致使消耗大量的CPU,對於單線程的Redis來講成本太高,所以Redis採用惰性刪除定時任務刪除機制實現過時鍵的內存回收。數據庫

  • 惰性刪除:惰性刪除用於當客戶端讀取帶有超時屬性的鍵時,若是已經超過鍵設置的過時時間,會執行刪除操做並返回空,這種策略是出於節省CPU成本考慮,不須要單獨維護TTL鏈表來處理過時鍵的刪除。可是單獨用這種方式存在內存泄露的問題,當過時鍵一直沒有訪問將沒法獲得及時刪除,從而致使內存不能及時釋放。正由於如此,Redis還提供另外一種定時任務刪除機制做爲惰性刪除的補充。
  • 定時任務刪除:Redis內部維護一個定時任務,默認每秒運行10次(經過配置hz控制)。定時任務中刪除過時鍵邏輯採用了自適應算法,根據鍵的過時比例,使用快慢兩種速率模式回收鍵。

好比:緩存

  1. 定時任務在每一個數據庫空間隨機檢查20個鍵,當發現過時時刪除對應的鍵。
  2. 若是超過檢查數25%的鍵過時,循環執行回收邏輯直到不足25%或運行超時爲止,慢模式下超時時間爲25ms。
  3. 若是以前回收鍵邏輯超時,則在Redis觸發內部事件以前再次以快模式運行回收過時鍵任務,快模式下超時時間爲1ms且2s內只能運行1次。
  4. 快慢兩種模式內部刪除邏輯相同,只是執行的超時時間不一樣。

內存溢出控制策略

當Redis所用內存達到maxmemory上限時會觸發相應的溢出控制策略。具體策略受maxmemory-policy參數控制,Redis支持6種策略,以下所示:dom

  • noeviction:默認策略,當內存不足以容納新寫入數據時,新寫入操做會報錯。應該沒人用吧。
  • allkeys-lru:當內存不足以容納新寫入數據時,在鍵空間中,移除最近最少使用的 Key。推薦使用,目前項目在用這種。
  • allkeys-random:當內存不足以容納新寫入數據時,在鍵空間中,隨機移除某個 Key。應該也沒人用吧,你不刪最少使用 Key,去隨機刪。
  • volatile-lru:當內存不足以容納新寫入數據時,在設置了過時時間的鍵空間中,移除最近最少使用的 Key。這種狀況通常是把 Redis 既當緩存,又作持久化存儲的時候才用。不推薦。
  • volatile-random:當內存不足以容納新寫入數據時,在設置了過時時間的鍵空間中,隨機移除某個 Key。依然不推薦。
  • volatile-ttl:當內存不足以容納新寫入數據時,在設置了過時時間的鍵空間中,有更早過時時間的 Key 優先移除。不推薦。若是沒有對應的鍵,則回退到noeviction策略

image

相關文章
相關標籤/搜索