1. 程式人生 > 實用技巧 >Redis過期機制

Redis過期機制

目錄

一、過期時間設定

TTL key : 獲取key的過期剩餘時間,不存在返回-2  無過期時間返回-1
PTTL key : 同TTL,毫秒
EXPIRE key ttl : 將鍵的生存時間設為 ttl 秒
PEXPIRE key ttl  :將鍵的生存時間設為 ttl 毫秒
EXPIREAT key timestamp :將鍵的過期時間設為 timestamp 所指定的秒數時間戳
PEXPIREAT key timestamp: 將鍵的過期時間設為 timestamp 所指定的毫秒數時間戳
PERSIST key : 去除ttl屬性,不會過期

二、Redis過期策略

1、被動刪除

  • 當讀/寫一個已經過期的key時,會觸發被動刪除策略,直接刪除掉這個過期key
  • 1、這種刪除策略對CPU友好,只會對檢測時過期的key進行刪除
  • 2、這種刪除策略對記憶體不友好,一個key已經過期,但是在它被檢測之前不會被刪除,仍然佔據記憶體空間,造成浪費。

2、主動刪除

  • 由於被動刪除策略無法保證過期資料被及時刪除,所以Redis會定期主動淘汰一批已過期的key

  • Redis會週期性的隨機測試一批設定了過期時間的key,比如每隔100毫秒執行以下步驟:

  • 1.隨機檢測100個設定了過期時間的key

  • 2.刪除已過期的key

  • 3.若刪除的key超過25個則重複步驟1

如果有大量的key同時到期,Redis會持續重複上述操作,直到百分比降到25%以下,此操作會持續佔用執行緒資源,導致阻塞

3、記憶體不足刪除

  • 當已用記憶體超過maxmemory時,觸發主動清理策略

清除策略

1. volatile-lru:只對設定了過期時間的key進行LRU(預設)
2. allkeys-lru : 刪除lru演算法的key
3. volatile-random:隨機刪除即將過期key
4. allkeys-random:隨機刪除
5. volatile-ttl : 刪除即將過期的
6. noeviction : 永不過期
  • 當mem_used記憶體已經超過maxmemory的設定,對於所有的讀寫請求,都會觸發函式清理超出的記憶體。
  • 注意這個清理過程是阻塞的,直到清理出足夠的記憶體空間。
  • 如果在達到maxmemory並且呼叫方還在不斷寫入的情況下,可能會反覆觸發主動清理策略,導致請求會有一定的延遲。