一、過期時間設置
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並且調用方還在不斷寫入的情況下,可能會反復觸發主動清理策略,導致請求會有一定的延遲。