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版本後新增的策略)
更多好文,公衆號持續更新