Redis 的 Key 過期后不會立即被刪除。Redis 采用了一種結合 ?惰性刪除 (Lazy Expiration)?? 和 ?定期刪除 (Periodic Expiration)?? 的策略來管理過期 Key 的回收,這是為了在內存管理、性能和 CPU 開銷之間取得平衡。
📌 Redis 過期 Key 刪除的兩種策略
🔍 1. ?惰性刪除 (Lazy Expiration)??
- ?觸發時機?:當客戶端嘗試訪問一個 Key 時,Redis 會先檢查這個 Key 是否已過期。
- ?執行過程?:
- 如果 Key 已過期,Redis 會立即刪除它,并返回?
nil
?給客戶端(就像這個 Key 不存在一樣)。 - 如果 Key 未過期,則正常返回其值。
- 如果 Key 已過期,Redis 會立即刪除它,并返回?
- ?優點?:
- ?CPU 友好?:只在訪問時檢查,不占用額外 CPU 資源掃描過期 Key。
- ?簡單高效?:對未過期的 Key 沒有額外開銷。
- ?缺點?:
- ?內存可能未及時釋放?:如果某個過期 Key 長時間不被訪問,它會一直占用內存,直到被訪問或通過定期刪除被清理。這可能導致內存浪費(內存泄漏假象)。
? 2. ?定期刪除 (Periodic Expiration / Probabilistic Algorithm)??
- ?觸發時機?:Redis 會 ?周期性? 地(默認每秒運行 10 次,可通過?
hz
?配置調整)隨機抽取一部分設置了過期時間的 Key 進行檢查。 - ?執行過程?:
- 從設置了過期時間的 Key 集合中,?隨機抽取? 一定數量的 Key(數量由配置控制)。
- 檢查這些被抽中的 Key 是否過期。
- 刪除所有已過期的 Key。
- 如果本輪抽查中過期 Key 的比例 ?超過 25%?,則立即重復步驟 1?(繼續抽查并刪除),直到比例低于 25% 或達到時間/次數限制。
- ?優點?:
- ?減少內存浪費?:即使 Key 不被訪問,也有機會被清理掉。
- ?可控的 CPU 開銷?:通過控制抽查頻率 (
hz
) 和每次抽查的數量,可以限制對 CPU 的影響。
- ?缺點?:
- ?非實時?:過期 Key 不會在過期那一刻被立即刪除,會有一定的延遲(通常在秒級)。
- ?可能遺漏?:如果過期 Key 比例很低或運氣不好沒被抽中,可能暫時不會被刪除。
📊 總結:Key 何時會被刪除?
場景 | 刪除機制 | 延遲性 |
---|---|---|
?Key 過期后被訪問? | 惰性刪除立即刪除 | 實時(訪問時觸發) |
?Key 過期后未被訪問,但被定期刪除抽中? | 定期刪除清理 | 秒級延遲(取決于抽查頻率和運氣) |
?Key 過期后長期未被訪問且未被抽中? | 可能滯留內存 | 不確定(直到被訪問或抽中) |
?? 注意事項與影響
- ?內存占用?:大量過期 Key 未被及時刪除會導致 Redis ?實際內存使用量高于有效數據量。監控時需關注?
expired_keys
?(累計刪除數) 和?evicted_keys
?(因內存不足被淘汰數) 指標。 - ?內存淘汰策略?:如果 Redis 配置了?
maxmemory
?且內存不足,即使 Key 未過期也可能根據策略(如?allkeys-lru
)被淘汰。而過期 Key 滯留會加速觸發內存淘汰,可能導致有用的 Key 被誤刪。 - ?性能影響?:定期刪除的 CPU 開銷取決于?
hz
?設置和過期 Key 數量。過高頻率的抽查會增加 CPU 負擔。 - ?命令影響?:像?
KEYS *
?或?SCAN
?命令可能會返回已過期但尚未被刪除的 Key(但在返回前會觸發惰性刪除)。
🛠? 如何應對過期 Key 滯留問題?
- ?監控告警?:監控 Redis 的?
used_memory
、expired_keys
、evicted_keys
?等指標,設置內存使用閾值告警。 - ?**調整?
hz
**?:適當增加?hz
?值(如從 10 調整到 100)可提高定期刪除頻率,加速清理過期 Key,但會增加 CPU 負載(需權衡)。 - ?避免大量 Key 同時過期?:對大量 Key 設置過期時間時,添加隨機因子(如?
TTL = base + random(0, 300)
),防止集中過期導致內存陡增或定期刪除壓力大。 - ?使用?
MEMORY PURGE
?命令 (Redis 4.0+)??:手動觸發內存清理(非標準命令,部分云服務商支持)。 - ?升級 Redis 版本?:新版 Redis 在內存管理和過期策略上可能有優化(如 Redis 6.0 的惰性刪除線程)。
💎 結論
Redis 為了性能犧牲了過期 Key 刪除的實時性。理解其 ?惰性刪除 + 定期刪除? 的組合策略,對于診斷內存異常、優化配置和保障系統穩定性至關重要。務必監控內存指標,并根據業務場景調整相關參數。