Redis過期機制
阿新 • • 發佈:2020-10-22
目錄
一、過期時間設定
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並且呼叫方還在不斷寫入的情況下,可能會反覆觸發主動清理策略,導致請求會有一定的延遲。