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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM