面試官:Redis過時key是怎麼清理的?

redis 的 key 清理,也就是內存回收的時候主要分爲:過時刪除策略與 內存淘汰策略兩部分。redis

過時刪除策略

刪除到達過時時間的 key 。算法

第一種:定時檢查刪除

對於每個設置了過時時間的 key 都會建立一個定時器,一旦達到過時時間都會刪除。這種方式當即清除過時數據,對內存比較好,dom

可是有缺點是:佔用了大量 CPU 的資源去處理過時數據,會影響 redis 的吞吐量 和 響應時間。spa

第二種:惰性檢查刪除

當訪問一個 key 的時候,纔會判斷該 key 是否過時,若是過時就刪除。該方式能最大限度節省 CPU 的資源。內存

可是對內存不太好,有一種比較極端的狀況:出現大量的過時 key 沒有被再次訪問,由於不會被清除,致使佔用了大量的內存。資源

第三種:按期檢查刪除

每隔一段時間,掃描redis 中過時key 的字典,並清除部分過時的key。這種方式是前倆種一種折中方法。不一樣的狀況下,調整定時掃描時間間隔,讓CPU 與 內存達到最優。it

內存淘汰策略

redis 內存淘汰策略是指達到maxmemory極限時,使用某種算法來決定來清理哪些數據,以保證新數據存入。io

第一類 不處理,等報錯(默認的配置)

  • noeviction,發現內存不夠時,不刪除key,執行寫入命令時直接返回錯誤信息。(Redis默認的配置就是noeviction)

第二類 從全部結果集中的key中挑選,進行淘汰

  • allkeys-random 就是從全部的key中隨機挑選key,進行淘汰
  • allkeys-lru 就是從全部的key中挑選最近使用時間距離如今最遠的key,進行淘汰
  • allkeys-lfu 就是從全部的key中挑選使用頻率最低的key,進行淘汰。(這是Redis 4.0版本後新增的策略)

第三類 從設置了過時時間的key中挑選,進行淘汰

    這種就是從設置了expires過時時間的結果集中選出一部分key淘汰,挑選的算法有:class

  • volatile-random 從設置了過時時間的結果集中隨機挑選key刪除。
  • volatile-lru 從設置了過時時間的結果集中挑選上次使用時間距離如今最久的key開始刪除
  • volatile-ttl 從設置了過時時間的結果集中挑選可存活時間最短的key開始刪除(也就是從哪些快要過時的key中先刪除)
  • volatile-lfu 從過時時間的結果集中選擇使用頻率最低的key開始刪除(這是Redis 4.0版本後新增的策略)

更多好文,公衆號持續更新

file

相關文章
相關標籤/搜索