Redis 過期策略
什么是過期策略
Redis 的過期策略用于管理設置了過期時間(TTL)的鍵,確保在鍵過期后能夠被及時刪除,從而釋放內存
整體策略
Redis 采用的是定期刪除
+惰性刪除
的組合策略
1. 定期刪除
- 原理:周期性的從過期鍵集合中抽取一部分鍵,驗證其過期時間,若已過期則刪除。
- 頻率:
默認
每秒運行 10 次,即每100ms
一次,可以通過修改配置更改頻率 - 優點:主動清理過期鍵,避免內存浪費,同時這種方式能保證抽取檢查的過程足夠快,避免長時間阻塞
- 缺點:占用一定的 CPU 資源
為什么定期刪除是周期性的抽取部分鍵?
因為redis是單線程的程序,主要的任務是處理每個命令的任務。
如果掃描過期key消耗的時間太多,就可能導致正常處理請求命令被阻塞(類似于在大量數據的背景下執行key *的效果)
2. 惰性刪除
- 原理:當鍵到達過期時間時,并不會立即被刪除。而是當后續有請求訪問該鍵時,Redis 服務器才會觸發刪除操作,并返回
nil
。 - 優點:節省 CPU 資源,只在必要時檢查。
- 缺點:如果一個鍵已經過期并一直未被訪問,它會持續占用內存,造成內存資源浪費
其他補充策略
為了彌補定期刪除和惰性刪除的不足,Redis 還提供了一系列 內存淘汰策略,用于在內存不足時主動淘汰部分鍵,保障服務器的正常運行。
Redis 內置淘汰策略
策略 | 淘汰范圍 | 淘汰算法 |
---|---|---|
noeviction | 無(默認策略) | 內存不足時寫入操作報錯 |
allkeys-lru | 所有鍵 | LRU |
allkeys-random | 所有鍵 | 隨機淘汰 |
volatile-lru | 設置過期時間的鍵 | LRU(最近最少使用) |
volatile-random | 設置過期時間的鍵 | 隨機淘汰 |
volatile-ttl | 設置過期時間的鍵 | 優先淘汰較早過期的鍵(FIFO) |