Redis 如何在刪除過期數(shù)據(jù)時,兼顧性能和內(nèi)存容量?
1、正常思路
1-1、定時刪除
定時掃描所有鍵值對,發(fā)現(xiàn)過期數(shù)據(jù)立即刪除。
優(yōu)點:內(nèi)存空間清理及時,有垃圾數(shù)據(jù)立即清除,確保了Redis的可用容量。
缺點:浪費CPU算力,對Redis中的所有數(shù)據(jù)進行全局遍歷是一件危險的事情,應(yīng)該盡力避免。這種做法會影響Redis的性能(吞吐量)。
1-2、懶惰刪除
數(shù)據(jù)過期后不做任何處理,每次被讀取時先判斷該數(shù)據(jù)是否過期,過期即刪。
優(yōu)點:性能優(yōu)異,不影響Redis的正常操作。
缺點:可能會在內(nèi)存中堆積大量過期數(shù)據(jù),占用存儲空間(極端情況:有些數(shù)據(jù)創(chuàng)建以后再也不會訪問了),這實際上相當(dāng)于內(nèi)存泄漏。
2、Redis的策略
這是一個基于概率的簡單策略,假設(shè)抽出的樣本能夠代表整個Redis存儲空間。
- Redis使用獨立的字典存儲設(shè)定了過期時間(expire)的數(shù)據(jù)的key,避免在各種操作時觸發(fā)全局遍歷。
- Redis 默認(rèn)每秒進行 10 次過期掃描,從過期字典中隨機選取 100 個 key,刪除其中已過期的數(shù)據(jù)。
- 如果上述掃描中發(fā)現(xiàn)過期 key 的比例超過 25%,則立即再發(fā)動一次掃描;直至比例降低到 25% 以下。
- 為保證過期掃描不會阻塞正常請求,CPU時間每秒鐘最多占用250ms。
以上的每秒掃描次數(shù),以及每秒最多占用的CPU時間,均受到配置文件 redis.conf 中的 hz 參數(shù)影響。