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

Redis過(guò)期數(shù)據(jù)的刪除策略詳解

 更新時(shí)間:2023年08月24日 09:50:47   作者:Upaaui  
Redis 是一個(gè)kv型數(shù)據(jù)庫(kù),我們所有的數(shù)據(jù)都是存放在內(nèi)存中的,但是內(nèi)存是有大小限制的,不可能無(wú)限制的增量,這篇文章主要介紹了Redis過(guò)期數(shù)據(jù)的刪除策略,需要的朋友可以參考下

1 介紹

Redis 是一個(gè)kv型數(shù)據(jù)庫(kù),我們所有的數(shù)據(jù)都是存放在內(nèi)存中的,但是內(nèi)存是有大小限制的,不可能無(wú)限制的增量。想要把不需要的數(shù)據(jù)清理掉,一種辦法是直接刪除,這個(gè)咱們前面章節(jié)有詳細(xì)說(shuō)過(guò);另外一種就是設(shè)置過(guò)期時(shí)間,緩存過(guò)期后,由Redis系統(tǒng)自行刪除。這邊需要注意的是,緩存過(guò)期之后,并不是馬上刪除的,那Redis是怎么刪除過(guò)期數(shù)據(jù)的呢?主要通過(guò)兩個(gè)方式

  • 惰性刪除
  • 通過(guò)定時(shí)任務(wù),定期選取部分?jǐn)?shù)據(jù)刪除

2 Redis緩存過(guò)期命令

我們通過(guò)以下指令給指定key的緩存設(shè)置過(guò)期時(shí)間,如果都沒(méi)設(shè)置過(guò)期時(shí)間, key 將一直存在,直到我們使用 Del 的命令明確刪除掉。

# 緩存時(shí)間過(guò)期命令,參考如下
EXPIRE key seconds [ NX | XX | GT | LT] 

Redis 7.0 開(kāi)始,EXPIRE 添加了 NX、XX和GT、LT 選項(xiàng),分別代表如下:

  • NX:僅當(dāng)Key沒(méi)有過(guò)期時(shí)設(shè)置過(guò)期時(shí)間
  • XX:僅當(dāng)Key已過(guò)期時(shí)設(shè)置過(guò)期時(shí)間
  • GT:僅當(dāng)新到期時(shí)間大于當(dāng)前到期時(shí)間時(shí)設(shè)置到期時(shí)間
  • LT:僅當(dāng)新到期時(shí)間小于當(dāng)前到期時(shí)間時(shí)設(shè)置到期時(shí)間

其中,GT、LT和NX選項(xiàng)是互斥的,下面是官方的測(cè)試用例:

redis> SET mykey "Hello"
"OK"
redis> EXPIRE mykey 10
(integer) 1
redis> TTL mykey
(integer) 10
redis> SET mykey "Hello World"
"OK"
redis> TTL mykey
(integer) -1
redis> EXPIRE mykey 10 XX
(integer) 0
redis> TTL mykey
(integer) -1
redis> EXPIRE mykey 10 NX
(integer) 1
redis> TTL mykey
(integer) 10
 

3 兩種過(guò)期數(shù)據(jù)的刪除方式

我們前面說(shuō)過(guò),Redis刪除過(guò)期數(shù)據(jù)主要通過(guò)以下兩個(gè)方式,我們一個(gè)個(gè)來(lái)看:

  • 惰性刪除
  • 通過(guò)定時(shí)任務(wù),定期選取部分?jǐn)?shù)據(jù)刪除

3.1 惰性刪除

惰性刪除比較簡(jiǎn)單,當(dāng)客戶(hù)端請(qǐng)求過(guò)來(lái)查詢(xún)我們的key的時(shí)候,先對(duì)key做一下檢查,如果沒(méi)過(guò)期則返回緩存數(shù)據(jù),如果過(guò)期,則刪除緩存,重新從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)。這樣,我們就把刪除過(guò)期數(shù)據(jù)的主動(dòng)權(quán)交給了訪(fǎng)問(wèn)請(qǐng)求的客戶(hù)端,如果客戶(hù)端一直沒(méi)請(qǐng)求,那這個(gè)過(guò)期緩存可能就長(zhǎng)時(shí)間得不到釋放。

Redis的源碼 src/db.c 中的 expireIfNeeded 方法 就是實(shí)現(xiàn)以上惰性刪除邏輯的,我們來(lái)看看:

int expireIfNeeded(redisDb *db, robj *key, int force_delete_expired) {
    // 對(duì)于未過(guò)期的key,直接 return 0
    if (!keyIsExpired(db,key)) return 0;	
	 /* If we are running in the context of a slave, instead of
     * evicting the expired key from the database, we return ASAP:
     * the slave key expiration is controlled by the master that will
     * send us synthesized DEL operations for expired keys.
     *
     * Still we try to return the right information to the caller,
     * that is, 0 if we think the key should be still valid, 1 if
     * we think the key is expired at this time. */
    if (server.masterhost != NULL) {
        if (server.current_client == server.master) return 0;
        if (!force_delete_expired) return 1;
    }
  /* If clients are paused, we keep the current dataset constant,
     * but return to the client what we believe is the right state. Typically,
     * at the end of the pause we will properly expire the key OR we will
     * have failed over and the new primary will send us the expire. */
    if (checkClientPauseTimeoutAndReturnIfPaused()) return 1;
    /* Delete the key */
    deleteExpiredKeyAndPropagate(db,key);
    return 1;
}

3.2 定期刪除

剛才前面說(shuō)過(guò)了,僅靠客戶(hù)端訪(fǎng)問(wèn)來(lái)對(duì)過(guò)期緩存執(zhí)行刪除遠(yuǎn)遠(yuǎn)不夠,因?yàn)橛械?key 過(guò)期了,但客戶(hù)端一直沒(méi)請(qǐng)求,那這個(gè)過(guò)期緩存可能就長(zhǎng)時(shí)間甚至永遠(yuǎn)得不到釋放。所以除了惰性刪除,Redis 還可以通過(guò)定時(shí)任務(wù)的方式來(lái)刪除過(guò)期的數(shù)據(jù)。定時(shí)任務(wù)的發(fā)起的頻率由redis.conf配置文件中的hz來(lái)進(jìn)行配置

# 代表每1s 運(yùn)行 10次
hz 10

Redis 默認(rèn)每 1 秒運(yùn)行 10 次,也就是每 100 ms 執(zhí)行一次,每次隨機(jī)抽取一些設(shè)置了過(guò)期時(shí)間的 key(這邊注意不是檢查所有設(shè)置過(guò)期時(shí)間的key,而是隨機(jī)抽取部分),檢查是否過(guò)期,如果發(fā)現(xiàn)過(guò)期了就直接刪除。該定時(shí)任務(wù)的具體流程如下:

  • 定時(shí)serverCron方法去執(zhí)行清理,執(zhí)行頻率根據(jù)redis.conf中的hz配置的值
  • 執(zhí)行清理的時(shí)候,不是去掃描所有的key,而是去掃描所有設(shè)置了過(guò)期時(shí)間的key(redisDb.expires)
  • 如果每次去把所有過(guò)期的key都拿過(guò)來(lái),那么假如過(guò)期的key很多,就會(huì)很慢,所以也不是一次性拿取所有的key
  • 根據(jù)hash桶的維度去掃描key,掃到20(可配)個(gè)key為止。假如第一個(gè)桶是15個(gè)key ,沒(méi)有滿(mǎn)足20,繼續(xù)掃描第二個(gè)桶,第二個(gè)桶20個(gè)key,由于是以hash桶的維度掃描的,所以第二個(gè)掃到了就會(huì)全掃,總共掃描35個(gè)key
  • 找到掃描的key里面過(guò)期的key,并進(jìn)行刪除
  • 刪除完檢查過(guò)期的 key 超過(guò) 25%,繼續(xù)執(zhí)行4、5步

image

其他注意點(diǎn):

  • 為何不掃描所有key進(jìn)行過(guò)期緩存元素刪除:Redis本身就是高速緩存,如果每次檢查大量的key,無(wú)論在CPU和內(nèi)存的的使用率上都會(huì)特別高,Redis集群越大,風(fēng)險(xiǎn)越大。
  • 分片模式下的刪除同步:無(wú)論定時(shí)刪除還是惰性刪除。master 會(huì)生成刪除的指令記錄到 AOF 和 slave 節(jié)點(diǎn)。

到此這篇關(guān)于Redis過(guò)期數(shù)據(jù)的刪除策略的文章就介紹到這了,更多相關(guān)Redis刪除策略?xún)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • redis?setex使用方法示例代碼

    redis?setex使用方法示例代碼

    SETEX?是?Redis?中的一個(gè)命令,用于設(shè)置鍵的值以及過(guò)期時(shí)間(以秒為單位),這篇文章主要介紹了redis?setex使用方法,需要的朋友可以參考下
    2024-07-07
  • redis-copy使用6379端口無(wú)法連接到Redis服務(wù)器的問(wèn)題

    redis-copy使用6379端口無(wú)法連接到Redis服務(wù)器的問(wèn)題

    這篇文章主要介紹了redis-copy使用6379端口無(wú)法連接到Redis服務(wù)器的問(wèn)題的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • 詳解Redis如何優(yōu)雅地實(shí)現(xiàn)接口防刷

    詳解Redis如何優(yōu)雅地實(shí)現(xiàn)接口防刷

    這篇文章主要為大家詳細(xì)介紹了Redis優(yōu)雅地實(shí)現(xiàn)接口防刷的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • 基于redis實(shí)現(xiàn)token驗(yàn)證用戶(hù)是否登陸

    基于redis實(shí)現(xiàn)token驗(yàn)證用戶(hù)是否登陸

    這篇文章主要為大家詳細(xì)介紹了基于redis實(shí)現(xiàn)token驗(yàn)證用戶(hù)是否登陸,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • 關(guān)于Redis最常見(jiàn)的十道面試題總結(jié)大全

    關(guān)于Redis最常見(jiàn)的十道面試題總結(jié)大全

    Redis作為一個(gè)高性能的內(nèi)存數(shù)據(jù)存儲(chǔ)系統(tǒng),具有快速讀寫(xiě)、持久性、數(shù)據(jù)結(jié)構(gòu)多樣性等特點(diǎn),廣泛應(yīng)用于各種應(yīng)用場(chǎng)景,這篇文章主要給大家介紹了關(guān)于Redis最常見(jiàn)的十道面試題總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • Redis key鍵的具體使用

    Redis key鍵的具體使用

    Redis 是一種鍵值(key-value)型的緩存型數(shù)據(jù)庫(kù),它將數(shù)據(jù)全部以鍵值對(duì)的形式存儲(chǔ)在內(nèi)存中,本文就來(lái)介紹一下key鍵的具體使用,感興趣的可以了解一下
    2024-02-02
  • redis3.2配置文件redis.conf詳細(xì)說(shuō)明

    redis3.2配置文件redis.conf詳細(xì)說(shuō)明

    redis3.2配置詳解,Redis啟動(dòng)的時(shí)候,可以指定配置文件,詳細(xì)說(shuō)明請(qǐng)看本文說(shuō)明
    2018-03-03
  • Redis:Redisson分布式鎖的使用方式(推薦使用)

    Redis:Redisson分布式鎖的使用方式(推薦使用)

    這篇文章主要介紹了Redis:Redisson分布式鎖的使用方式(推薦使用),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Redis實(shí)現(xiàn)登錄注冊(cè)的示例代碼

    Redis實(shí)現(xiàn)登錄注冊(cè)的示例代碼

    本文主要介紹了Redis實(shí)現(xiàn)登錄注冊(cè)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Redis?Server啟動(dòng)過(guò)程的詳細(xì)步驟

    Redis?Server啟動(dòng)過(guò)程的詳細(xì)步驟

    本文主要介紹了Redis?Server啟動(dòng)過(guò)程的詳細(xì)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02

最新評(píng)論