欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Redis刪除過期key策略詳解

 更新時(shí)間:2023年10月18日 11:09:48   作者:fking86  
Redis是一款高性能的開源內(nèi)存數(shù)據(jù)庫,廣泛應(yīng)用于緩存、消息隊(duì)列、實(shí)時(shí)分析等場(chǎng)景,在Redis中,我們經(jīng)常需要?jiǎng)h除過期的key,以釋放內(nèi)存空間并保持?jǐn)?shù)據(jù)的有效性,本文將為您詳細(xì)介紹Redis的過期key刪除策略,幫助您更好地管理和優(yōu)化Redis數(shù)據(jù)庫

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)文章!

相關(guān)文章

  • 使用Redis實(shí)現(xiàn)實(shí)時(shí)排行榜的示例

    使用Redis實(shí)現(xiàn)實(shí)時(shí)排行榜的示例

    為了實(shí)現(xiàn)一個(gè)實(shí)時(shí)排行榜系統(tǒng),我們可以使用Redis的有序集合,本文主要介紹了使用Redis實(shí)現(xiàn)實(shí)時(shí)排行榜的示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-04-04
  • Redis分布式緩存-Redis持久化詳解

    Redis分布式緩存-Redis持久化詳解

    RDB持久化將內(nèi)存數(shù)據(jù)快照到磁盤,用于故障恢復(fù);AOF持久化記錄每個(gè)寫命令,提供數(shù)據(jù)安全性,兩者各有優(yōu)缺點(diǎn),可根據(jù)需求選擇或結(jié)合使用
    2024-12-12
  • Redis數(shù)據(jù)庫的使用場(chǎng)景介紹(避免誤用Redis)

    Redis數(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-03
  • 詳解Redis?鍵和字符串常用命令

    詳解Redis?鍵和字符串常用命令

    字符串是?Redis?最基本的數(shù)據(jù)結(jié)構(gòu),它將以一個(gè)鍵?和一個(gè)值?儲(chǔ)存在?Redis?內(nèi)部,本文重點(diǎn)給大家介紹Redis鍵和字符串常用命令,感興趣的朋友一起看看吧
    2022-02-02
  • Redis集群的搭建圖文教程

    Redis集群的搭建圖文教程

    下面小編就為大家分享一篇Redis集群的搭建圖文教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2017-11-11
  • Redis五大基本數(shù)據(jù)類型及對(duì)應(yīng)使用場(chǎng)景總結(jié)

    Redis五大基本數(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-08
  • Redis過期時(shí)間的設(shè)計(jì)與實(shí)現(xiàn)代碼

    Redis過期時(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-08
  • redis哨兵模式分布式鎖實(shí)現(xiàn)與實(shí)踐方式(redisson)

    redis哨兵模式分布式鎖實(shí)現(xiàn)與實(shí)踐方式(redisson)

    這篇文章主要介紹了redis哨兵模式分布式鎖實(shí)現(xiàn)與實(shí)踐方式(redisson),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Redis實(shí)現(xiàn)用戶簽到的示例代碼

    Redis實(shí)現(xiàn)用戶簽到的示例代碼

    Redis的位圖可以高效實(shí)現(xiàn)用戶簽到功能,每個(gè)bit位對(duì)應(yīng)一個(gè)簽到狀態(tài),節(jié)省存儲(chǔ)空間,利用SETBIT、GETBIT等命令操作簽到數(shù)據(jù),可統(tǒng)計(jì)連續(xù)簽到天數(shù)和本月簽到情況,感興趣的可以了解一下
    2024-09-09
  • Redis處理高并發(fā)機(jī)制原理及實(shí)例解析

    Redis處理高并發(fā)機(jī)制原理及實(shí)例解析

    這篇文章主要介紹了Redis處理高并發(fā)機(jī)制原理及實(shí)例解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值析,需要的朋友可以參考下
    2020-08-08

最新評(píng)論