Redis刪除過期key策略詳解
Redis中key的的過期時(shí)間
Redis 中可以為 key 設(shè)置過期時(shí)間,到期后 key 會(huì)自動(dòng)被刪除,過期時(shí)間可以通過以下幾種方式設(shè)置:
在創(chuàng)建 key 時(shí)使用 EXPIRE 命令設(shè)置過期時(shí)間(秒級(jí))
示例:
EXPIRE key1 30 # 30秒過期
使用 EXPIREAT 命令設(shè)置一個(gè)精確的過期時(shí)間(unix 時(shí)間戳)
示例:
EXPIREAT key2 1651811000 # 2022-05-06 14:30:00 過期
使用 PEXPIRE 命令設(shè)置過期時(shí)間(毫秒級(jí))
示例:
PEXPIRE key3 6000 # 6秒過期
使用 PEXPIREAT 命令設(shè)置毫秒級(jí)精確過期時(shí)間
示例:
PEXPIREAT key4 1651811000000 # 2022-05-06 14:30:00.000過期
在 Redis 配置文件中設(shè)置所有 key 的默認(rèn)過期時(shí)間
通過 default-ttl 參數(shù)配置默認(rèn)過期時(shí)間
# redis.conf default-ttl 3600 # 默認(rèn)1小時(shí)過期
使用 PERSIST 命令可以移除一個(gè) key 的過期時(shí)間設(shè)置
PERSIST key2 # 移除key2的過期時(shí)間
使用 TTL 命令可以查看一個(gè) key 剩余的過期時(shí)間
TTL key3 # 查看key3的剩余過期時(shí)間
Redis 提供了靈活的 key 過期時(shí)間設(shè)置,可以按需為不同 key 設(shè)置過期時(shí)間。
Redis過期鍵刪除策略
Redis key過期的方式有三種:
- 被動(dòng)刪除:當(dāng)讀/寫一個(gè)已經(jīng)過期的key時(shí),會(huì)觸發(fā)惰性刪除策略,直接刪除掉這個(gè)過期key
- 主動(dòng)刪除:由于惰性刪除策略無法保證冷數(shù)據(jù)被及時(shí)刪掉,所以Redis會(huì)定期主動(dòng)淘汰一批已過期的key
- 當(dāng)前已用內(nèi)存超過maxmemory限定時(shí),觸發(fā)主動(dòng)清理策略
1、定時(shí)刪除
定時(shí)刪除是在設(shè)置key的過期時(shí)間的同時(shí),會(huì)創(chuàng)建一個(gè)定時(shí)器(timer)。定時(shí)器在key的過期時(shí)間來臨時(shí),立即執(zhí)行對(duì)key的刪除操作。
此種刪除策略可以保證過期key會(huì)盡可能快的被刪除,并釋放過期key所占用的內(nèi)存。
但是此種策略對(duì)CPU時(shí)間是最不友好的。在過期key比較多的情況下,刪除過期key這一行為可能會(huì)占用相當(dāng)一部分CPU時(shí)間,在內(nèi)存不緊張但是CPU時(shí)間非常緊張的情況下,將CPU時(shí)間用在刪除和當(dāng)前任務(wù)無關(guān)的過期key上,無疑會(huì)對(duì)服務(wù)器的響應(yīng)時(shí)間和吞吐量造成影響。
例如,正有大量的命令請(qǐng)求在等待服務(wù)器處理,并且服務(wù)器當(dāng)前不缺少內(nèi)存的情況下,服務(wù)器應(yīng)當(dāng)優(yōu)先將CPU時(shí)間用在處理客戶端的命令請(qǐng)求上面,而不是用在刪除過期key上面。
并且創(chuàng)建一個(gè)定時(shí)器(timer)需要用到Redis服務(wù)器中的時(shí)間事件,而當(dāng)前時(shí)間事件是用無序鏈表實(shí)現(xiàn)的,查找一個(gè)事件的時(shí)間復(fù)雜度為O(N),并不能高效地處理大量時(shí)間事件。要讓服務(wù)器創(chuàng)建大量的定時(shí)器,從而實(shí)現(xiàn)定時(shí)刪除,在現(xiàn)階段來說并不現(xiàn)實(shí)。
優(yōu)點(diǎn):
1.可以自動(dòng)清理不需要的緩存數(shù)據(jù),減少內(nèi)存占用。
2.可以定時(shí)刷新部分緩存,保證數(shù)據(jù)實(shí)時(shí)性。
3.可以根據(jù)業(yè)務(wù)需求自定義不同的數(shù)據(jù)緩存周期。
4.操作簡(jiǎn)單,只需要設(shè)置過期時(shí)間,不需要手動(dòng)刪除。
缺點(diǎn):
1.需要額外的內(nèi)存來存儲(chǔ) key 的過期時(shí)間。
2.過期刪除是被動(dòng)操作,無法按需主動(dòng)刪除。
3.過期時(shí)間的精度只到秒級(jí),無法更細(xì)粒度控制。
4.如果過期 key 數(shù)量很多,過期刪除時(shí)還是有一定性能開銷。
5.只依賴過期時(shí)間可能導(dǎo)致一段時(shí)間內(nèi)緩存量激增,需配合其它方式控制。
示例:
// 設(shè)置10秒過期 jedis.setex("data", 10, "cache");
2、定期刪除
定期刪除是指Redis會(huì)每隔一段時(shí)間,對(duì)部分key進(jìn)行檢查和刪除。具體來說,Redis會(huì)每隔一段時(shí)間隨機(jī)抽取一部分key,檢查其是否過期,如果過期則刪除。
優(yōu)點(diǎn):
1.減少每次訪問的時(shí)間復(fù)雜度。
2.減少刪除操作對(duì)CPU時(shí)間的影響。
缺點(diǎn):
可能會(huì)有一些過期key沒有被及時(shí)刪除。
通過定期刪除策略,可以有效地減少因?yàn)檫^期key而帶來的內(nèi)存浪費(fèi)。
示例:
// 定期掃描刪除 public void delKeys(){ Set<String> keys = jedis.keys("cache:*"); jedis.del(keys.toArray(new String[0])); } // 調(diào)度執(zhí)行 scheduledExecutorService.scheduleAtFixedRate(this::delKeys, 0, 1, TimeUnit.HOURS);
3、惰性刪除
惰性刪除是指在訪問某個(gè)key時(shí),Redis會(huì)先檢查該key是否過期,如果過期則立即刪除。這種策略的優(yōu)點(diǎn)是能夠及時(shí)釋放內(nèi)存空間,但缺點(diǎn)是會(huì)增加每次訪問的時(shí)間復(fù)雜度,因?yàn)樾枰M(jìn)行過期檢查。
惰性刪除是定時(shí)刪除和定期刪除的折中處理方案。它放任key過期不管,但是每次獲取key時(shí),都會(huì)檢查取得的key是否過期,如果過期,則刪除該key;若沒有過期,就返回該key的值。
優(yōu)點(diǎn):
對(duì)CPU時(shí)間來說是最友好的,只在取出key時(shí),才對(duì)key進(jìn)行過期檢查,即只會(huì)在非做不可的情況下進(jìn)行,并且刪除的目標(biāo)僅限于當(dāng)前處理的key,不會(huì)在刪除其他無關(guān)的過期key上花費(fèi)任何CPU時(shí)間。
缺點(diǎn):
對(duì)內(nèi)存是最不友好的。如果一個(gè)key已經(jīng)過期,而這個(gè)key又仍然保留在db中,那么只要這個(gè)過期key不被刪除,它所占用的內(nèi)存就不會(huì)釋放。例如,如果db中有非常多的過期key,而這些過期key又恰好沒有被訪問到的話,那它們也許永遠(yuǎn)也不會(huì)被刪除,除非用戶手動(dòng)執(zhí)行flushdb命令清空,這樣會(huì)導(dǎo)致大量的無用的臟數(shù)據(jù)占用大量的內(nèi)存。
示例:
jedis.set("key", "value"); jedis.unlink("key"); // 惰性標(biāo)記刪除
總結(jié)
Redis的過期key刪除策略是惰性刪除、定期刪除和定時(shí)刪除的混合策略。惰性刪除能夠及時(shí)釋放內(nèi)存空間,但會(huì)增加每次訪問的時(shí)間復(fù)雜度;定期刪除能夠減少時(shí)間復(fù)雜度,但可能會(huì)有一些過期key沒有被及時(shí)刪除;定時(shí)刪除能夠精確控制過期時(shí)間,但需要額外的定時(shí)任務(wù)。通過這種混合策略,Redis能夠在保證內(nèi)存空間的同時(shí),盡可能地減少對(duì)性能的影響。
以上就是Redis刪除過期key策略詳解的詳細(xì)內(nèi)容,更多關(guān)于Redis刪除過期key的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Redis集群下過期key監(jiān)聽的實(shí)現(xiàn)代碼
- spring boot+redis 監(jiān)聽過期Key的操作方法
- redis監(jiān)聽key過期事件的詳細(xì)步驟
- Redis設(shè)置key的過期時(shí)間
- Redis監(jiān)聽過期的key實(shí)現(xiàn)流程詳解
- redis?key鍵過期刪除策略及淘汰機(jī)制探究
- redis key過期監(jiān)聽的實(shí)現(xiàn)示例
- Redis Key過期監(jiān)聽的配置詳解
- Redis?key的過期時(shí)間和永久有效的實(shí)現(xiàn)
- Redis中key過期策略的實(shí)現(xiàn)
相關(guān)文章
使用Redis實(shí)現(xiàn)實(shí)時(shí)排行榜的示例
為了實(shí)現(xiàn)一個(gè)實(shí)時(shí)排行榜系統(tǒng),我們可以使用Redis的有序集合,本文主要介紹了使用Redis實(shí)現(xiàn)實(shí)時(shí)排行榜的示例,具有一定的參考價(jià)值,感興趣的可以了解一下2025-04-04Redis數(shù)據(jù)庫的使用場(chǎng)景介紹(避免誤用Redis)
這篇文章主要介紹了Redis數(shù)據(jù)庫的使用場(chǎng)景介紹(避免誤用Redis),本文用簡(jiǎn)要的語言總結(jié)了Redis數(shù)據(jù)庫的適應(yīng)場(chǎng)合,人而避免錯(cuò)誤的使用它而產(chǎn)生昂貴的維護(hù)代價(jià),需要的朋友可以參考下2015-03-03Redis五大基本數(shù)據(jù)類型及對(duì)應(yīng)使用場(chǎng)景總結(jié)
Redis有五種基本數(shù)據(jù)類型,分別是字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted?Set),這些基本數(shù)據(jù)類型使得Redis具備了豐富的數(shù)據(jù)結(jié)構(gòu)和功能,適用于各種不同的應(yīng)用場(chǎng)景,本文就給大家詳細(xì)的介紹一下這五大類型2023-08-08Redis過期時(shí)間的設(shè)計(jì)與實(shí)現(xiàn)代碼
在?Redis?中,鍵的過期時(shí)間設(shè)計(jì)與實(shí)現(xiàn)是一個(gè)重要的功能,這使得?Redis?可以自動(dòng)刪除在指定時(shí)間后不再需要的鍵,下面詳細(xì)介紹?Redis?過期時(shí)間的設(shè)計(jì)和實(shí)現(xiàn),包括設(shè)置過期時(shí)間、過期鍵的存儲(chǔ)結(jié)構(gòu)、過期鍵的刪除策略等,需要的朋友可以參考下2024-08-08redis哨兵模式分布式鎖實(shí)現(xiàn)與實(shí)踐方式(redisson)
這篇文章主要介紹了redis哨兵模式分布式鎖實(shí)現(xiàn)與實(shí)踐方式(redisson),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03Redis處理高并發(fā)機(jī)制原理及實(shí)例解析
這篇文章主要介紹了Redis處理高并發(fā)機(jī)制原理及實(shí)例解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值析,需要的朋友可以參考下2020-08-08