在Redis 設定 Key 之後,針對一些短期用途的 key (驗證,限時單),可以透過設定過期時間,

設定key的存活時間。

SET key "值"

Redis 設定 key 過期時間的方式有以下幾種,返回1表示成功,返回0表示key不存在或設置失敗。

//於指定秒數後過期
EXPIRE key "seconds"

//於指定毫秒過期
PEXPIRE key "milliseconds"

//於指定的timestamp時間戳記(秒)後過期
EXPIREAT key "timestamp"

//於指定的timestamp時間戳記(毫秒)後過期
PEXPIREAT key "milliseconds-timestamp"

也可透過 SETEX

CVT2HUGO: 同時設定 key 及過期時間,等同於 SET + EXPIRE
SETEX key "seconds"

查看 key 過期時間的方式

// {-2: "Key 不存在或已過期", -1: "無過期時間", 數值:"表示剩餘存活秒數"}
TTL key

// {-2: "Key 不存在或已過期", -1: "無過期時間", 數值:"表示剩餘存活毫秒"}
PTTL key

清除過期時間,可以將原本設定過期時間,改為無過期

PERSIST key

清除過期Key 的原理

在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仍發生內存不足,則會拋出錯誤。