Redis如何清理過期的key以及對應(yīng)的解決方法分析
在 Redis 中,可以通過特定的命令為 Key 設(shè)置過期時(shí)間,使得 Key 在一定時(shí)間后自動刪除,這對于管理緩存、驗(yàn)證碼等臨時(shí)數(shù)據(jù)非常有用。
解決方法
1. Redis過期刪除策略
1.1 如何實(shí)現(xiàn)過期策略
對一個(gè) key 設(shè)置了過期時(shí)間時(shí),Redis 會把該 key 帶上過期時(shí)間存儲到一個(gè)過期字典中,字典保存了數(shù)據(jù)庫中所有 key 的過期時(shí)間。
1.2 如何實(shí)現(xiàn)刪除策略
1.2.1 常見的三種過期刪除策略
定時(shí)刪除:指在指定的時(shí)間點(diǎn)自動刪除某些內(nèi)容或文件。
惰性刪除:可能指的是一種被動或延遲的刪除方式,即在某些條件下或觸發(fā)某些事件后才進(jìn)行刪除。
定期刪除:指按照一定的時(shí)間間隔(如每天、每周等)自動刪除某些內(nèi)容或文件。
1.2.2 Redis 使用的過期刪除策略
惰性刪除:
客戶端:
這是流程的起點(diǎn),表示用戶或應(yīng)用程序發(fā)起了一個(gè)請求。
請求 key:
客戶端請求一個(gè)特定的數(shù)據(jù)項(xiàng),這個(gè)數(shù)據(jù)項(xiàng)通過一個(gè)唯一的標(biāo)識符(key)來標(biāo)識。
是否過期:
這是一個(gè)決策點(diǎn),系統(tǒng)需要檢查請求的 key 是否已經(jīng)過期。這通常涉及到檢查 key 的有效期限或最后訪問時(shí)間。
是(刪除 key):
如果 key 已經(jīng)過期,流程進(jìn)入這一分支。系統(tǒng)將執(zhí)行刪除操作,移除這個(gè)過期的 key 及其關(guān)聯(lián)的數(shù)據(jù)。
返回 null:
刪除操作完成后,系統(tǒng)向客戶端返回一個(gè) null 值,表示請求的數(shù)據(jù)項(xiàng)已被刪除,不再可用。
結(jié)束:
流程結(jié)束,客戶端接收到 null 值后,可以進(jìn)行相應(yīng)的處理,如提示用戶數(shù)據(jù)已過期或刪除。
否(返回?cái)?shù)據(jù)):
如果 key 沒有過期,流程進(jìn)入這一分支。系統(tǒng)將檢索并返回與該 key 關(guān)聯(lián)的數(shù)據(jù)。
結(jié)束:
流程結(jié)束,客戶端接收到請求的數(shù)據(jù),可以進(jìn)行進(jìn)一步的處理或顯示。
也就是說刪除操作是在數(shù)據(jù)被請求時(shí)才進(jìn)行的,而不是預(yù)先計(jì)劃的。這種策略可以減少不必要的刪除操作,只有在數(shù)據(jù)確實(shí)不再需要時(shí)才進(jìn)行刪除
定時(shí)刪除:
開始:
這是流程的起點(diǎn),表示定期刪除過程的開始。
過期字典隨機(jī)抽取:
在這一步,系統(tǒng)從存儲過期數(shù)據(jù)的字典中隨機(jī)抽取一部分?jǐn)?shù)據(jù)進(jìn)行處理。
刪除過期 key:
系統(tǒng)檢查抽取的數(shù)據(jù)中哪些 key 已經(jīng)過期,并執(zhí)行刪除操作。
執(zhí)行時(shí)間上限:
這是一個(gè)決策點(diǎn),系統(tǒng)檢查刪除操作的執(zhí)行時(shí)間是否超過了預(yù)設(shè)的時(shí)間上限。
如果執(zhí)行時(shí)間超過了上限,流程將跳轉(zhuǎn)到“結(jié)束”步驟,以避免過長的刪除操作影響系統(tǒng)性能。
過期 key 超過 25%:
另一個(gè)決策點(diǎn),系統(tǒng)檢查被抽取的數(shù)據(jù)中過期的 key 是否超過了 25%。
如果過期的 key 超過了 25%,說明有大量的數(shù)據(jù)需要?jiǎng)h除,流程將返回到“過期字典隨機(jī)抽取”步驟,繼續(xù)處理更多的數(shù)據(jù)。
如果過期的 key 沒有超過 25%,流程將進(jìn)入“結(jié)束”步驟。
結(jié)束:
這是流程的終點(diǎn),表示定期刪除過程的結(jié)束。
也就是說刪除操作是按照一定的周期進(jìn)行的,而不是在數(shù)據(jù)被請求時(shí)才進(jìn)行。這種策略有助于系統(tǒng)定期清理過期數(shù)據(jù),保持系統(tǒng)的整潔和性能。
2. Redis內(nèi)存淘汰策略
noeviction(不淘汰數(shù)據(jù)):
當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時(shí),Redis將拒絕執(zhí)行寫入操作(如SET、LPUSH等)。
這種策略不會主動刪除任何數(shù)據(jù),適用于對數(shù)據(jù)完整性要求非常高的場景。
進(jìn)行數(shù)據(jù)淘汰:
當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時(shí),Redis將根據(jù)配置的淘汰策略來刪除一些數(shù)據(jù)以釋放內(nèi)存。
這種策略適用于需要?jiǎng)討B(tài)調(diào)整內(nèi)存使用的場景。
存在過期時(shí)間數(shù)據(jù):
這類數(shù)據(jù)是指設(shè)置了過期時(shí)間的鍵(key),Redis可以對這類數(shù)據(jù)應(yīng)用以下幾種淘汰策略:
volatile-random:從設(shè)置了過期時(shí)間的鍵中隨機(jī)選擇一些進(jìn)行刪除。
volatile-ttl:從設(shè)置了過期時(shí)間的鍵中選擇即將過期的鍵進(jìn)行刪除。
volatile-lru(Least Recently Used):從設(shè)置了過期時(shí)間的鍵中選擇最近最少使用的鍵進(jìn)行刪除。
volatile-lfu(Least Frequently Used):從設(shè)置了過期時(shí)間的鍵中選擇使用頻率最低的鍵進(jìn)行刪除。
所有數(shù)據(jù):
這類數(shù)據(jù)是指所有存儲在Redis中的鍵,包括設(shè)置了過期時(shí)間和未設(shè)置過期時(shí)間的鍵。Redis可以對這類數(shù)據(jù)應(yīng)用以下幾種淘汰策略:
allkeys-random:從所有鍵中隨機(jī)選擇一些進(jìn)行刪除。
allkeys-lru:從所有鍵中選擇最近最少使用的鍵進(jìn)行刪除。
allkeys-lfu:從所有鍵中選擇使用頻率最低的鍵進(jìn)行刪除。
通過這些策略,Redis可以在內(nèi)存達(dá)到最大限制時(shí),根據(jù)實(shí)際需求和數(shù)據(jù)的重要性來靈活地選擇哪些數(shù)據(jù)應(yīng)該被刪除,以確保系統(tǒng)的穩(wěn)定性和性能。
總結(jié)
到此這篇關(guān)于Redis如何清理過期的key以及對應(yīng)的解決方法的文章就介紹到這了,更多相關(guān)Redis清理過期key內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
CentOS系統(tǒng)安裝Redis及Redis的PHP擴(kuò)展詳解
這篇文章主要介紹了CentOS系統(tǒng)下安裝Redis數(shù)據(jù)的教程,以及詳解了Redis數(shù)據(jù)庫的PHP擴(kuò)展,文中介紹的很詳細(xì),相信對大家的理解和學(xué)習(xí)具有一定的參考借鑒價(jià)值,有需要的朋友們可以參考借鑒,下面來一起看看吧。2016-12-12Redis內(nèi)部數(shù)據(jù)結(jié)構(gòu)Dict的實(shí)現(xiàn)方法
這篇文章主要介紹了Redis內(nèi)部數(shù)據(jù)結(jié)構(gòu)Dict的實(shí)現(xiàn)方法,本篇文章所述的dict在Redis中最主要的作用就是用于維護(hù)Redis數(shù)據(jù)庫中所有Key、value映射的數(shù)據(jù)結(jié)構(gòu),需要的朋友可以參考下2022-05-05redis replication環(huán)形緩沖區(qū)算法詳解
這篇文章主要介紹了redis replication環(huán)形緩沖區(qū)算法的使用,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04