在Redis 基於性能考量,並不會對每一個過期的key做及時刪除,主要透過以下幾種方式來清除過期的key:

被動清除

當過期的 key 被訪問時,會將其從內存中刪除

主動刪除

在 Redis 持久化的過程,會在一定時間做持久化及清除內存。

在清除內存時,採用的是隨機取樣的方式來刪除過期的 key (預設為 100 個key)

此外,會檢查有設定過期的key是否超過一定比例(預設為 25%),若超過就會執行清除。

記憶體不足時,觸發清除行為

在記憶體不足時,會執行清除,但這時會根據redis設定的刪除策略來執行刪除。

清除的策略可透過 maxmemory-policy 來指定:

LRU 算法主要依據時間,採取"最近最少使用的key"

LFU 算法主要依據訪問率,採取"最不常使用的key"

  1. volatile-lru 採用LRU算法刪除(針對設定過期時間的key)

  2. allkeys-lru 採用LRU算法刪除key

  3. volatile-lfu 採用LFU算法刪除(針對設定過期時間的key)

  4. allkeys-lfu 採用LFU算法刪除key

  5. volatile-random 隨機刪除(針對設定過期時間的key)

  6. allkeys-random 隨機刪除key

  7. volatile-ttl 刪除即將過期的key

  8. noeviction 不刪除,直接返回錯誤(Redis預設)

如果刪除key仍發生內存不足,則會拋出錯誤。