Redis是如何處理過(guò)期鍵的
作者:有只貓咪叫富貴
?Redis在不同版本中處理過(guò)期鍵的機(jī)制總體一致,主要包含以下三種策略:惰性刪除、定期刪除 和 內(nèi)存淘汰策略。
Redis在不同版本中處理過(guò)期鍵的機(jī)制總體一致,主要包含以下三種策略:惰性刪除、定期刪除 和 內(nèi)存淘汰策略。以下是Redis處理過(guò)期鍵的詳細(xì)介紹及各版本的相關(guān)變化:
1. 基本機(jī)制
Redis的鍵過(guò)期時(shí)間處理方式包含以下兩種主要策略:
(1)惰性刪除(Lazy Deletion)
- 機(jī)制:僅在嘗試訪問(wèn)一個(gè)鍵時(shí),Redis會(huì)檢查其是否過(guò)期。如果過(guò)期,則在訪問(wèn)時(shí)刪除鍵。
- 優(yōu)點(diǎn):不需要額外的后臺(tái)資源,節(jié)省CPU開(kāi)銷。
- 缺點(diǎn):如果某些過(guò)期鍵長(zhǎng)時(shí)間不被訪問(wèn),它們會(huì)一直占用內(nèi)存。
(2)定期刪除(Periodic Deletion)
- 機(jī)制:Redis會(huì)周期性地隨機(jī)檢查一部分設(shè)置了過(guò)期時(shí)間的鍵,如果發(fā)現(xiàn)過(guò)期鍵,則刪除它們。
- 頻率:由 hz 參數(shù)控制,默認(rèn)每秒執(zhí)行10次。每次操作中,Redis會(huì)從過(guò)期字典中抽樣一定數(shù)量的鍵進(jìn)行檢查和刪除。
- 優(yōu)點(diǎn):保證大部分過(guò)期鍵能夠及時(shí)被刪除。
- 缺點(diǎn):如果過(guò)期鍵數(shù)量巨大,可能會(huì)造成刪除不及時(shí),增加內(nèi)存壓力。
(3)內(nèi)存淘汰策略
- 觸發(fā)條件:當(dāng)內(nèi)存使用量達(dá)到 maxmemory 設(shè)置的上限,Redis會(huì)根據(jù)配置的淘汰策略(如LRU、LFU等)刪除一部分鍵,包括未設(shè)置過(guò)期時(shí)間的鍵。
- 作用:防止因過(guò)多未刪除的過(guò)期鍵導(dǎo)致內(nèi)存溢出。
2. Redis各版本的處理機(jī)制和優(yōu)化
Redis 2.x
- 實(shí)現(xiàn)了基本的過(guò)期機(jī)制,包括惰性刪除和定期刪除。
- 定期刪除頻率較低,可能導(dǎo)致某些過(guò)期鍵未及時(shí)刪除。
Redis 3.x
- 改進(jìn)定期刪除邏輯:優(yōu)化了定期刪除的采樣和迭代策略,提升了過(guò)期鍵的清理效率。
- 增強(qiáng)內(nèi)存淘汰策略:引入了 volatile-lfu 和 allkeys-lfu 策略,使得鍵的訪問(wèn)頻率成為淘汰的重要依據(jù)。
Redis 4.x
- 改進(jìn)定期刪除算法:定期刪除更加智能,抽樣和逐步刪除的策略更高效,減少了對(duì)CPU的突發(fā)壓力。
- 引入內(nèi)存診斷工具:提供命令幫助用戶檢測(cè)內(nèi)存中的過(guò)期鍵比例和內(nèi)存占用情況(如 INFO 命令中的 expired_keys 和 evicted_keys)。
Redis 5.x
- 引入異步刪除:對(duì)一些大對(duì)象(如大型哈希表或集合)采用異步刪除策略,以避免主線程因刪除操作被阻塞。
- 改進(jìn)后臺(tái)清理線程:后臺(tái)任務(wù)的定期清理更加智能,能根據(jù)實(shí)例負(fù)載動(dòng)態(tài)調(diào)整清理頻率。
Redis 6.x
- 增強(qiáng)多線程支持:在開(kāi)啟多線程的模式下(針對(duì)I/O操作),過(guò)期鍵的清理速度進(jìn)一步提高。
- 改進(jìn)淘汰機(jī)制:優(yōu)化內(nèi)存淘汰策略的性能,減少在高并發(fā)場(chǎng)景下可能的延遲。
Redis 7.x
- 支持細(xì)粒度的過(guò)期時(shí)間(毫秒級(jí)):允許鍵以毫秒為單位設(shè)置過(guò)期時(shí)間,提升時(shí)間精度。
- 加強(qiáng)過(guò)期鍵的統(tǒng)計(jì):提供了更多關(guān)于過(guò)期鍵的統(tǒng)計(jì)信息和指標(biāo)。
- 引入動(dòng)態(tài)配置機(jī)制:用戶可以動(dòng)態(tài)調(diào)整 hz 參數(shù)、maxmemory 策略等,無(wú)需重啟Redis實(shí)例。
3. 參數(shù)相關(guān)配置
以下是與過(guò)期鍵相關(guān)的重要參數(shù):
- hz:控制定期任務(wù)(包括過(guò)期鍵檢查)的執(zhí)行頻率,默認(rèn)10。
- maxmemory-policy:設(shè)置內(nèi)存淘汰策略,包括:
- volatile-lru:在所有帶有過(guò)期時(shí)間的key中使用LRU算法淘汰數(shù)據(jù)。
- allkeys-lru:在所有的key中使用LRU算法淘汰數(shù)據(jù)。
- volatile-ttl:在所有帶有過(guò)期時(shí)間的key中,優(yōu)先淘汰TTL(Time To Live)最短的數(shù)據(jù)。
- allkeys-random:在所有帶有過(guò)期時(shí)間的key中隨機(jī)淘汰數(shù)據(jù)。
- volatile-random:在所有的key中隨機(jī)淘汰數(shù)據(jù)。
- noeviction:不淘汰任何數(shù)據(jù),在內(nèi)存不足時(shí)直接返回錯(cuò)誤。
- maxmemory:設(shè)置Redis實(shí)例允許使用的最大內(nèi)存。
4. 性能優(yōu)化建議
- 合理設(shè)置過(guò)期時(shí)間:避免大量鍵同時(shí)過(guò)期,導(dǎo)致CPU負(fù)載激增。
- 調(diào)整 hz 參數(shù):提高定期刪除頻率,適當(dāng)加速過(guò)期鍵清理。
- 使用異步刪除:對(duì)于大對(duì)象,采用異步刪除以降低主線程阻塞風(fēng)險(xiǎn)。
- 優(yōu)化內(nèi)存淘汰策略:根據(jù)業(yè)務(wù)需求選擇合適的淘汰策略,防止內(nèi)存不足導(dǎo)致實(shí)例不可用。
通過(guò)這些機(jī)制和優(yōu)化策略,Redis能夠高效地管理過(guò)期鍵并減少對(duì)性能的影響。
責(zé)任編輯:武曉燕
來(lái)源:
程序員故里