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

redis延遲雙刪策略示例講解

 更新時(shí)間:2023年04月14日 11:24:14   作者:每一天,為明天,go  
延遲是指當(dāng)前請(qǐng)求邏輯處理延時(shí),而不是當(dāng)前線程或進(jìn)程睡眠延遲,下面這篇文章主要給大家介紹了關(guān)于redis延遲雙刪策略的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

在當(dāng)前環(huán)境下,通常我們會(huì)首選redis緩存來減輕我們數(shù)據(jù)庫訪問壓力。但是也會(huì)遇到以下這種情況:大量用戶來訪問我們系統(tǒng),首先會(huì)去查詢緩存, 如果緩存中沒有數(shù)據(jù),則去查詢數(shù)據(jù)庫,然后更新數(shù)據(jù)到緩存中,并且如果數(shù)據(jù)庫中的數(shù)據(jù)發(fā)生了改變則需要同步到redis中,同步過程中需要保證 MySQL與redis數(shù)據(jù)一致性問題,在這個(gè)同步過程中出現(xiàn)短暫的數(shù)據(jù)延遲也是正?,F(xiàn)象,但是最終需要保證mysql與緩存中的一致性。

//我們通常使用redis的邏輯
    //通常我們是先查詢r(jià)eids
    String value = RedisUtils.get(key);
    if (!StringUtils.isEmpty(value)){
        return value;
    }
//從數(shù)據(jù)庫中獲取數(shù)據(jù)
    value = getValueForDb(key);
    if (!StringUtils.isEmpty(value)){
           RedisUtils.set(key,value);
        return value;
     }

1、什么是延遲雙刪?

延遲雙刪策略是分布式系統(tǒng)中數(shù)據(jù)庫存儲(chǔ)和緩存數(shù)據(jù)保持一致性的常用策略,但它不是強(qiáng)一致。其實(shí)不管哪種方案,都避免不了Redis存在臟數(shù)據(jù)的問題,只能減輕這個(gè)問題,要想徹底解決,得要用到同步鎖和對(duì)應(yīng)的業(yè)務(wù)邏輯層面解決。

2、為什么要進(jìn)行延遲雙刪?

一般我們?cè)诟聰?shù)據(jù)庫數(shù)據(jù)時(shí),需要同步redis中緩存的數(shù)據(jù) 所以我們一般會(huì)給出兩種方案:

  • 第一種方案:先執(zhí)行update操作,再執(zhí)行緩存清除。
  • 第二種方案:先執(zhí)行緩存清除,再執(zhí)行update操作。

但是這兩種方案在并發(fā)請(qǐng)求中容易出現(xiàn)以下問題

第一種方案弊端:當(dāng)請(qǐng)求1去執(zhí)行數(shù)據(jù)庫更新操作之后,還沒執(zhí)行緩存清除時(shí),請(qǐng)求2就進(jìn)來了查詢了緩存,此時(shí)緩存中數(shù)據(jù)還是舊數(shù)據(jù),還沒來得機(jī)刪除導(dǎo)致數(shù)據(jù)出現(xiàn)問題,但是當(dāng)t1執(zhí)行緩存刪除操作之后,后面的請(qǐng)求查詢不到緩存,再到數(shù)據(jù)中查詢,然后更新到緩存中,這種影響是比較小的

  1. t1線程 先更新db;
  2. t2線程查詢命中緩存 返回舊的數(shù)據(jù);
  3. 假設(shè)t1線程更新完db,預(yù)計(jì)5毫秒刪除完緩存key 在5毫秒內(nèi) 其他線程查詢緩存結(jié)果還是為舊的數(shù)據(jù),但是 5毫秒后查詢緩存結(jié)果是為空,在從新將db最新的結(jié)果同步到Redis中。
  4. 一個(gè)項(xiàng)目中出現(xiàn)延遲是非常正常的,所以該情況發(fā)生的延遲對(duì)業(yè)務(wù)的影響其實(shí)很小。但是如果發(fā)生了,刪除緩存失敗呢?

1.不斷重試----如果是在http協(xié)議接口中 會(huì)導(dǎo)致接口響應(yīng)變慢 調(diào)用該接口 會(huì)發(fā)生響應(yīng)超時(shí) 2.或者通過mq異步的形式同步

第二種方案弊端:當(dāng)請(qǐng)求1執(zhí)行清除緩存后,還未執(zhí)行數(shù)據(jù)更新操作的時(shí),請(qǐng)求2進(jìn)來查詢到數(shù)據(jù)庫的舊數(shù)據(jù),并寫入了redis,這就導(dǎo)致了數(shù)據(jù)庫與redis數(shù)據(jù)不一致問題。

  • t1線程先刪除緩存;
  • t2線程讀取緩存為null,同步db數(shù)據(jù)到緩存中;
  • t1線程更新db中的數(shù)據(jù);
  • t3線程查詢緩存中數(shù)據(jù)是舊數(shù)據(jù);

3、對(duì)于方案處理都有弊端,那么我們需要使用延遲雙刪策略

先進(jìn)行緩存清除,再執(zhí)行update,最后(延遲N秒)再執(zhí)行緩存清除。進(jìn)行兩次刪除,且中間需要延遲一段時(shí)間

    RedisUtils.del(key);// 先刪除緩存    updateDB(user);// 更新db中的數(shù)據(jù)    Thread.sleep(N);// 延遲一段時(shí)間,在刪除該緩存key    RedisUtils.del(key);// 先刪除緩存

4、需要注意的點(diǎn)

上述中(延遲N秒)的時(shí)間要大于一次寫操作的時(shí)間。原因:如果延遲時(shí)間小于寫入redis的時(shí)間,會(huì)導(dǎo)致請(qǐng)求1清除了緩存,但是請(qǐng)求2緩存還未寫入的尷尬。。。

5、延遲的時(shí)間如何確定?

在業(yè)務(wù)程序運(yùn)行時(shí),統(tǒng)計(jì)業(yè)務(wù)邏輯執(zhí)行讀數(shù)據(jù)和寫緩存的操作時(shí)間,以此為基礎(chǔ)來進(jìn)行估算。因?yàn)檫@個(gè)方案會(huì)在第一次刪除緩存值后,延遲一段時(shí)間再次進(jìn)行刪除,所以稱為“延遲雙刪”。

小結(jié)

延遲雙刪策略只是一種同步數(shù)據(jù)庫與緩存的手段,在系統(tǒng)并發(fā)量不高的情況下可以使用這種方式解決,如果是并發(fā)量高的情況下我們也可以另尋其他解決方案 如:canal

到此這篇關(guān)于redis延遲雙刪策略的文章就介紹到這了,更多相關(guān)redis延遲雙刪策略內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis?分布式鎖必避的?8?大問題及解決方案全解析

    Redis?分布式鎖必避的?8?大問題及解決方案全解析

    文章主要討論了Redis分布式鎖在實(shí)際應(yīng)用中常見的8大問題,包括誤刪他人持有鎖、鎖過期提前釋放、Redis單點(diǎn)故障、鎖無法重入、主從切換鎖丟失、加鎖失敗無重試策略、長(zhǎng)時(shí)間持有鎖和鎖key設(shè)計(jì)不當(dāng)?shù)?感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • Redis中ZSet數(shù)據(jù)結(jié)構(gòu)與滑動(dòng)窗口應(yīng)用實(shí)現(xiàn)

    Redis中ZSet數(shù)據(jù)結(jié)構(gòu)與滑動(dòng)窗口應(yīng)用實(shí)現(xiàn)

    Redis?ZSET融合哈希表與跳躍表,支持O(1)成員查詢和O(logN)排序,適用于排行榜及滑動(dòng)時(shí)間窗口限流,下面就來介紹一下Redis中ZSet數(shù)據(jù)結(jié)構(gòu)與滑動(dòng)窗口應(yīng)用,感興趣的可以了解一下
    2025-07-07
  • Redis實(shí)現(xiàn)多級(jí)緩存

    Redis實(shí)現(xiàn)多級(jí)緩存

    這篇文章主要為大家詳細(xì)介紹了Redis實(shí)現(xiàn)多級(jí)緩存,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • Redis三種集群模式詳解

    Redis三種集群模式詳解

    redis有三種集群模式,其中主從是最常見的模式,今天通過本文給大家分享Redis三種集群模式介紹,感興趣的朋友一起看看吧
    2021-10-10
  • Windows操作系統(tǒng)下Redis服務(wù)安裝圖文教程

    Windows操作系統(tǒng)下Redis服務(wù)安裝圖文教程

    這篇文章主要介紹了Windows操作系統(tǒng)下Redis服務(wù)安裝圖文教程,文中給大家提供了redis的下載地址,安裝程序步驟,需要的朋友可以參考下
    2018-03-03
  • 詳解緩存穿透擊穿雪崩解決方案

    詳解緩存穿透擊穿雪崩解決方案

    在我們?nèi)粘5拈_發(fā)中,有時(shí)需要系統(tǒng)在極短的時(shí)間內(nèi)完成成千上萬次的讀/寫操作,這個(gè)時(shí)候不是數(shù)據(jù)庫能夠承受的,通常會(huì)引入NoSQL技術(shù)。redis技術(shù)就是NoSQL技術(shù)中的一種,但是引入redis又有可能出現(xiàn)緩存穿透,緩存擊穿,緩存雪崩等問題。本文就對(duì)這三種問題進(jìn)行較深入剖析。
    2021-05-05
  • 淺談Redis在直播場(chǎng)景的實(shí)踐方案

    淺談Redis在直播場(chǎng)景的實(shí)踐方案

    這篇文章主要介紹了淺談Redis在直播場(chǎng)景的實(shí)踐方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 詳解Redis緩存與Mysql如何保證雙寫一致

    詳解Redis緩存與Mysql如何保證雙寫一致

    緩存和數(shù)據(jù)庫如何保證數(shù)據(jù)的一致是個(gè)很經(jīng)典的問題,這篇文章就來和大家一起探討一下Redis緩存與Mysql如何保證雙寫一致,感興趣的小伙伴可以參考下
    2023-12-12
  • Redis序列化反序列化不一致導(dǎo)致String類型值多了雙引號(hào)問題

    Redis序列化反序列化不一致導(dǎo)致String類型值多了雙引號(hào)問題

    這篇文章主要介紹了Redis序列化反序列化不一致導(dǎo)致String類型值多了雙引號(hào)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Redis性能大幅提升之Batch批量讀寫詳解

    Redis性能大幅提升之Batch批量讀寫詳解

    這篇文章主要給大家介紹了關(guān)于Redis性能大幅提升之Batch批量讀寫的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。
    2017-06-06

最新評(píng)論

建宁县| 星子县| 庆城县| 兴城市| 蚌埠市| 法库县| 金沙县| 泊头市| 天门市| 延寿县| 东兰县| 瓦房店市| 什邡市| 保定市| 长汀县| 盐池县| 上犹县| 女性| 枣阳市| 浮山县| 阿荣旗| 广宁县| 安乡县| 平潭县| 巴彦淖尔市| 湄潭县| 城市| 淮南市| 象州县| 五家渠市| 紫阳县| 台安县| 东乌珠穆沁旗| 泾源县| 沙洋县| 龙山县| 乐业县| 太保市| 万安县| 玉山县| 大渡口区|