最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis中過期鍵刪除的三種方法

 更新時間:2024年05月19日 09:04:52   作者:物與我皆無盡也  
Redis中可以設(shè)置鍵的過期時間,并且通過取出過期字典(expires dict)中鍵的過期時間和當(dāng)前時間比較來判斷是否過期,那么一個過期的鍵是怎么被刪除的呢?本文給大家總結(jié)了三種方法,選了其中兩種給大家詳細的介紹一下,需要的朋友可以參考下

Redis中可以設(shè)置鍵的過期時間,并且通過取出過期字典(expires dict)中鍵的過期時間和當(dāng)前時間比較來判斷是否過期。

那么一個過期的鍵是怎么被刪除的呢?

定時刪除

定時刪除:在設(shè)置鍵的過期時間時,創(chuàng)建一個定時器(timer),讓定時器在鍵的過期時間來臨時,立即執(zhí)行對鍵的刪除操作。

這是對內(nèi)存最友好的,因為他通過定時器保證了過期即會刪除,并釋放過期鍵占用的內(nèi)存。但是這是對CPU最不友好的,在過期鍵比較多的情況下,刪除大量過期鍵會占用相當(dāng)一部分CPU時間,會對服務(wù)器的的響應(yīng)時間和吞吐量造成影響。

如果服務(wù)器當(dāng)前不缺少內(nèi)存,那么服務(wù)器應(yīng)該優(yōu)先將CPU時間用在處理客戶端的命令請求上面,而不是用在刪除過期鍵上面。
而且,創(chuàng)建一個定時器需要用到Redis服務(wù)器中的時間事件,而其實現(xiàn)方式是無序鏈表,所以查找一個事件的時間復(fù)雜度為O(N),并不能高效地處理大量時間事件。

惰性刪除

惰性刪除:放任鍵過期不管,但是每次從鍵空間中獲取鍵時,都檢查取得的鍵是否過期,如果過期的話,就刪除該鍵;如果沒有過期,就返回該鍵。

惰性刪除策略對CPU時間來說是最友好的:程序只會在取出鍵時才對鍵進行過期檢查。但它對內(nèi)存是最不友好的,如果一個鍵已經(jīng)過期,那么只要這個過期鍵不被訪問,它所占用的內(nèi)存就不會釋放。(甚至可以將這種情況看作是一種內(nèi)存泄漏,這對于運行狀態(tài)非常依賴于內(nèi)存的Redis服務(wù)器來說,肯定不是一個好消息)

定期刪除

定期刪除:每隔一段時間,程序就對數(shù)據(jù)庫進行一次檢查,刪除里面的過期鍵。至于要刪除多少過期鍵,以及要檢查多少個數(shù)據(jù)庫,則由算法決定。

定期刪除策略是前兩種策略的一種整合和折中,它的難點是確定刪除操作執(zhí)行的時長和頻率:

  • 如果刪除操作執(zhí)行得太頻繁,或者執(zhí)行的時間太長,定期刪除策略就會退化成定時
    刪除策略,以至于將CPU時間過多地消耗在刪除過期鍵上面。
  • 如果刪除操作執(zhí)行得太少,或者執(zhí)行的時間太短,定期刪除策略又會和惰性刪除策
    略一樣,出現(xiàn)浪費內(nèi)存的情況

因此,如果采用定期刪除策略的話,服務(wù)器必須根據(jù)情況合理地設(shè)置刪除操作的執(zhí)行時長和執(zhí)行頻率。

Redis的實現(xiàn)

Redis 選擇「惰性刪除+定期刪除」這兩種策略配和使用

惰性刪除

惰性刪除策略由db.c/expireIfNeeded函數(shù)實現(xiàn),所有讀寫數(shù)據(jù)庫的Redis命令在執(zhí)行之前都會調(diào)用expireIfNeeded函數(shù)對輸入鍵進行檢查:如果輸人鍵已經(jīng)過期,那么將輸人鍵從數(shù)據(jù)庫中刪除;如果輸人鍵未過期,則不做動作。

Redis 的惰性刪除策略由db.c文件中的 expireIfNeeded 函數(shù)實現(xiàn),代碼如下:

int expireIfNeeded(redisDb *db, robj *key) {
    // 判斷 key 是否過期
    if (!keyIsExpired(db,key)) 
        return 0;

    // 刪除過期鍵 
    // 如果 server.lazyfree_lazy_expire 為 1 表示異步刪除,反之同步刪除;
    return server.lazyfree_lazy_expire ? dbAsyncDelete(db,key) :
                                         dbSyncDelete(db,key);
}

Redis 在訪問或者修改 key 之前,都會調(diào)用 expireIfNeeded 函數(shù)對其進行檢查,檢查 key 是否過期:

  • 如果過期,則刪除該 key,至于選擇異步刪除,還是選擇同步刪除,根據(jù) lazyfree_lazy_expire 參數(shù)配置決定(Redis 4.0版本開始提供參數(shù)),然后返回 null 客戶端
  • 如果沒有過期,正常處理指令

定期刪除

在 Redis 中,默認每秒進行 10 次過期檢查一次數(shù)據(jù)庫,此配置可通過 Redis 的配置文件 redis.conf 進行配置(hz),它的默認值是10。

過期鍵的定期刪除策略由redis.c/activeExpireCycle函數(shù)實現(xiàn),每當(dāng)Redis的服務(wù)器周期性操作redis.c/serverCron函數(shù)執(zhí)行時,activeExpireCycle函數(shù)就會被調(diào)用,它在規(guī)定的時間內(nèi),分多次遍歷服務(wù)器中的各個數(shù)據(jù)庫,從數(shù)據(jù)庫的過期字典(expires dict)中隨機檢查一部分鍵的過期時間,并刪除其中的過期鍵。

過程用偽代碼表示為:

#代碼來自《Redis設(shè)計與實現(xiàn)》,版本是Redis 2.9。跟新版redis應(yīng)該有所偏差

#默認每次檢查的數(shù)據(jù)庫數(shù)量
DEFAULT_ DB_ NUMBERS = 16
#默認每個數(shù)據(jù)庫檢查的鍵數(shù)量
DEFAULT KEY_ NUMBERS = 20
#全局變量,記錄檢查進度.
current_ db = 0

def activeExpireCycle() :
    #遍歷各個數(shù)據(jù)庫
    for i in range (db_numbers) :
        #已經(jīng)遍歷一輪,將current_ db重置為0,開始新的一輪遍歷
        if current_db == server.dbnum:
            current_db = 0
            
        #獲取當(dāng)前要處理的數(shù)據(jù)庫
        redisDb = server.db[current__db]
        #將數(shù)據(jù)庫索引增1,指向下一個要處理的數(shù)據(jù)庫
        current_db += 1
        
        #檢查數(shù)據(jù)庫鍵
        for j in range (DEFAULT_KEY_NUMBERS) :
            #如果數(shù)據(jù)庫中沒有一個鍵帶有過期時間,那么跳過這個數(shù)據(jù)庫
            if redisDb.expires.size() == 0: 
                break
                
            #隨機獲取一個帶有過期時間的鍵
        	key_with_ttl = redisDb.expires.get_random_key ()
            #檢查鍵是否過期,如果過期就刪除它.
            if is_expired(key_with_ttl) :
            	delete_key(key_with_ttl)
            
            #已達到時間上限,停止處理
            if reach_time_limit() : return

總的來說就是,定期刪除會在規(guī)定時間(時間不超過上限,25ms)內(nèi)依次遍歷所有數(shù)據(jù)庫,對于每個數(shù)據(jù)庫會依次隨機獲取20個鍵并刪除過期的鍵,如果過期鍵超過25%會繼續(xù)隨機獲取20個鍵。

以上就是Redis中過期鍵刪除的三種方法的詳細內(nèi)容,更多關(guān)于Redis過期鍵刪除的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • redis中key使用冒號分隔的原理小結(jié)

    redis中key使用冒號分隔的原理小結(jié)

    Redis是一種高性能的鍵值對非關(guān)系型數(shù)據(jù)庫,通過redis不同類型命令可以為其中的鍵指定不同的數(shù)據(jù)類型,其中每個鍵的命名規(guī)范通常使用冒號符號分隔字符串,本文主要介紹了redis中key使用冒號分隔的原理小結(jié),感興趣的可以了解一下
    2024-01-01
  • Redis解決緩存一致性問題

    Redis解決緩存一致性問題

    本文主要介紹了Redis?解決緩存一致性問題,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-10-10
  • Redis實現(xiàn)布隆過濾器的代碼詳解

    Redis實現(xiàn)布隆過濾器的代碼詳解

    布隆過濾器(Bloom?Filter)是Redis?4.0版本提供的新功能,它被作為插件加載到Redis服務(wù)器中,給Redis提供強大的去重功能,本文將給大家詳細介紹一下Redis布隆過濾器,文中有相關(guān)的代碼示例,需要的朋友可以參考下
    2023-07-07
  • redis序列化及各種序列化情況劃分

    redis序列化及各種序列化情況劃分

    本文主要介紹了redis序列化及各種序列化情況劃分,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Redis優(yōu)惠券秒殺企業(yè)實戰(zhàn)

    Redis優(yōu)惠券秒殺企業(yè)實戰(zhàn)

    本文主要介紹了Redis優(yōu)惠券秒殺企業(yè)實戰(zhàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 基于Redis?Set輕松實現(xiàn)簡單的抽獎系統(tǒng)

    基于Redis?Set輕松實現(xiàn)簡單的抽獎系統(tǒng)

    Redis Set集合是無序且元素唯一的String類型數(shù)據(jù)結(jié)構(gòu),支持高效增刪查改操作,包括獲取所有值、判斷包含關(guān)系、計算交并差集等,底層基于Hash表實現(xiàn)O(1)時間復(fù)雜度,這篇文章主要介紹了基于Redis?Set輕松實現(xiàn)簡單的抽獎系統(tǒng)的相關(guān)資料,需要的朋友可以參考下
    2026-03-03
  • redis過期回調(diào)坑的解決

    redis過期回調(diào)坑的解決

    Redis提供了一種過期回調(diào)的機制,可以在某個鍵過期時觸發(fā)一個回調(diào)函數(shù),然而,在實際使用中,我們往往會遇到一些災(zāi)難性的問題,其中一個就是在使用過期回調(diào)的時候,我們可能會遭遇到無法預(yù)料的錯誤,本文就詳細的介紹一下
    2023-09-09
  • CentOS 6.5 64位下安裝Redis3.0.2的具體步驟

    CentOS 6.5 64位下安裝Redis3.0.2的具體步驟

    這篇文章主要介紹了CentOS 6.5 64位下安裝Redis3.0.2的具體步驟,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-08-08
  • Redis 緩存滿了如何解決

    Redis 緩存滿了如何解決

    Redis 緩存使用內(nèi)存來保存數(shù)據(jù),隨著需要緩存的數(shù)據(jù)量越來越大,有限的緩存空間不可避免地會被寫滿,本文主要介紹了Redis 緩存滿了如何解決,感興趣的可以了解一下
    2023-08-08
  • Redis哨兵模式實現(xiàn)一主二從三哨兵

    Redis哨兵模式實現(xiàn)一主二從三哨兵

    本文主要介紹了Redis哨兵模式實現(xiàn)一主二從三哨兵,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07

最新評論

涪陵区| 连南| 桐柏县| 开封市| 马公市| 汝阳县| 拜泉县| 镇巴县| 康平县| 启东市| 沈丘县| 汨罗市| 威远县| 会泽县| 贡觉县| 大理市| 宁夏| 富民县| 米脂县| 馆陶县| 金乡县| 兴山县| 齐河县| 淮北市| 丽水市| 运城市| 张家港市| 上高县| 驻马店市| 邵东县| 靖江市| 怀来县| 嘉义县| 镇康县| 屏南县| 汪清县| 新源县| 嘉禾县| 建昌县| 南部县| 卢湾区|