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

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

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

1 介紹

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

  • 惰性刪除
  • 通過定時任務,定期選取部分數(shù)據(jù)刪除

2 Redis緩存過期命令

我們通過以下指令給指定key的緩存設置過期時間,如果都沒設置過期時間, key 將一直存在,直到我們使用 Del 的命令明確刪除掉。

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

Redis 7.0 開始,EXPIRE 添加了 NX、XX和GT、LT 選項,分別代表如下:

  • NX:僅當Key沒有過期時設置過期時間
  • XX:僅當Key已過期時設置過期時間
  • GT:僅當新到期時間大于當前到期時間時設置到期時間
  • LT:僅當新到期時間小于當前到期時間時設置到期時間

其中,GT、LT和NX選項是互斥的,下面是官方的測試用例:

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 兩種過期數(shù)據(jù)的刪除方式

我們前面說過,Redis刪除過期數(shù)據(jù)主要通過以下兩個方式,我們一個個來看:

  • 惰性刪除
  • 通過定時任務,定期選取部分數(shù)據(jù)刪除

3.1 惰性刪除

惰性刪除比較簡單,當客戶端請求過來查詢我們的key的時候,先對key做一下檢查,如果沒過期則返回緩存數(shù)據(jù),如果過期,則刪除緩存,重新從數(shù)據(jù)庫中獲取數(shù)據(jù)。這樣,我們就把刪除過期數(shù)據(jù)的主動權交給了訪問請求的客戶端,如果客戶端一直沒請求,那這個過期緩存可能就長時間得不到釋放。

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

int expireIfNeeded(redisDb *db, robj *key, int force_delete_expired) {
    // 對于未過期的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 定期刪除

剛才前面說過了,僅靠客戶端訪問來對過期緩存執(zhí)行刪除遠遠不夠,因為有的 key 過期了,但客戶端一直沒請求,那這個過期緩存可能就長時間甚至永遠得不到釋放。所以除了惰性刪除,Redis 還可以通過定時任務的方式來刪除過期的數(shù)據(jù)。定時任務的發(fā)起的頻率由redis.conf配置文件中的hz來進行配置

# 代表每1s 運行 10次
hz 10

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

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

image

其他注意點:

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

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

相關文章

  • 解決linux下redis數(shù)據(jù)庫overcommit_memory問題

    解決linux下redis數(shù)據(jù)庫overcommit_memory問題

    這篇文章介紹了解決linux下redis數(shù)據(jù)庫overcommit_memory問題的方法,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-02-02
  • redis以目錄形式存儲和讀取數(shù)據(jù)實現(xiàn)方式

    redis以目錄形式存儲和讀取數(shù)據(jù)實現(xiàn)方式

    這段文章主要討論了在項目中使用Redis進行數(shù)據(jù)寫入與讀取的方法,并強調了合理設置key的重要性,建議使用特定目錄形式,如“company:companyTree-all”來組織數(shù)據(jù)結構,以提高數(shù)據(jù)管理效率
    2026-05-05
  • Redis中ziplist壓縮列表的實現(xiàn)

    Redis中ziplist壓縮列表的實現(xiàn)

    本文主要介紹了Redis中ziplist壓縮列表的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • redis源碼分析教程之壓縮鏈表ziplist詳解

    redis源碼分析教程之壓縮鏈表ziplist詳解

    ziplist結構在redis運用非常廣泛,是列表、字典等數(shù)據(jù)類型的底層結構之一。ziplist的優(yōu)點在于能夠一定程度地節(jié)約內存。下面這篇文章主要給大家介紹了關于redis源碼分析教程之壓縮鏈表ziplist的相關資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-12-12
  • linux?redis-連接命令解讀

    linux?redis-連接命令解讀

    這篇文章主要介紹了linux?redis-連接命令解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 淺談redission鎖的默認失效時間

    淺談redission鎖的默認失效時間

    Redisson是一個基于Redis的Java駐留庫,提供了許多分布式對象和服務,包括分布式鎖,本文主要介紹了淺談redission鎖的默認失效時間, 具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • Spring?Boot?緩存?與?Redis問題小結

    Spring?Boot?緩存?與?Redis問題小結

    本文總結SpringBoot緩存方案,對比Redis與EnCache優(yōu)劣,指出Redis支持集群但效率較低,EnCache速度快但不支持分布式,SpringBoot默認使用ConcurrentHashMapManager,本文給大家介紹Spring?Boot緩存與Redis問題小結,感興趣的朋友一起看看吧
    2025-07-07
  • Redis的主從同步解析

    Redis的主從同步解析

    這篇文章主要介紹了Redis的主從同步解析,見識淺薄,僅供參考。
    2017-10-10
  • 基于redis 7.2.3的makefile源碼解讀學習

    基于redis 7.2.3的makefile源碼解讀學習

    這篇文章主要為大家介紹了基于redis 7.2.3的makefile源碼解讀學習,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • redis保存AtomicInteger對象踩坑及解決

    redis保存AtomicInteger對象踩坑及解決

    這篇文章主要介紹了redis保存AtomicInteger對象踩坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11

最新評論

仲巴县| 兴业县| 闽清县| 昌平区| 龙川县| 库尔勒市| 松溪县| 濉溪县| 江永县| 临邑县| 满洲里市| 滕州市| 和田县| 大悟县| 和龙市| 青河县| 霍山县| 龙陵县| 墨江| 岳阳县| 桃园县| 全椒县| 壤塘县| 桓仁| 常熟市| 怀集县| 泾川县| 伊吾县| 彭阳县| 柳江县| 郁南县| 和顺县| 大石桥市| 横峰县| 博白县| 彭泽县| 开平市| 远安县| 博兴县| 迁安市| 白银市|