在Redis 基於性能考量,並不會對每一個過期的key做及時刪除,主要透過以下幾種方式來清除過期的key:
被動清除
當過期的 key 被訪問時,會將其從內存中刪除
主動刪除
在 Redis 持久化的過程,會在一定時間做持久化及清除內存。
在清除內存時,採用的是隨機取樣的方式來刪除過期的 key (預設為 100 個key)
此外,會檢查有設定過期的key是否超過一定比例(預設為 25%),若超過就會執行清除。
記憶體不足時,觸發清除行為
在記憶體不足時,會執行清除,但這時會根據redis設定的刪除策略來執行刪除。
清除的策略可透過 maxmemory-policy 來指定:
LRU 算法主要依據時間,採取"最近最少使用的key"
LFU 算法主要依據訪問率,採取"最不常使用的key"
-
volatile-lru 採用LRU算法刪除(針對設定過期時間的key)
-
allkeys-lru 採用LRU算法刪除key
-
volatile-lfu 採用LFU算法刪除(針對設定過期時間的key)
-
allkeys-lfu 採用LFU算法刪除key
-
volatile-random 隨機刪除(針對設定過期時間的key)
-
allkeys-random 隨機刪除key
-
volatile-ttl 刪除即將過期的key
-
noeviction 不刪除,直接返回錯誤(Redis預設)
如果刪除key仍發生內存不足,則會拋出錯誤。