精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

MySQL與Redis延遲雙刪策略

科技綠洲 ? 來源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-09-25 14:28 ? 次閱讀

背景

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

//我們通常使用redis的邏輯
    //通常我們是先查詢reids
    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ù)庫存儲和緩存數(shù)據(jù)保持一致性的常用策略,但它不是強一致。其實不管哪種方案,都避免不了Redis存在臟數(shù)據(jù)的問題,只能減輕這個問題,要想徹底解決,得要用到同步鎖和對應(yīng)的業(yè)務(wù)邏輯層面解決。

2、為什么要進行延遲雙刪?

一般我們在更新數(shù)據(jù)庫數(shù)據(jù)時,需要同步redis中緩存的數(shù)據(jù) 所以我們一般會給出兩種方案:

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

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

圖片

  • 第一種方案弊端:當(dāng)請求1去執(zhí)行數(shù)據(jù)庫更新操作之后,還沒執(zhí)行緩存清除時,請求2就進來了查詢了緩存,此時緩存中數(shù)據(jù)還是舊數(shù)據(jù),還沒來得機刪除導(dǎo)致數(shù)據(jù)出現(xiàn)問題,但是當(dāng)t1執(zhí)行緩存刪除操作之后,后面的請求查詢不到緩存,再到數(shù)據(jù)中查詢,然后更新到緩存中,這種影響是比較小的
    1. t1線程 先更新db;
    2. t2線程查詢命中緩存 返回舊的數(shù)據(jù);
    3. 假設(shè)t1線程更新完db,預(yù)計5毫秒刪除完緩存key 在5毫秒內(nèi) 其他線程查詢緩存結(jié)果還是為舊的數(shù)據(jù),但是 5毫秒后查詢緩存結(jié)果是為空,在從新將db最新的結(jié)果同步到Redis中。
    4. 一個項目中出現(xiàn)延遲是非常正常的,所以該情況發(fā)生的延遲對業(yè)務(wù)的影響其實很小。但是如果發(fā)生了,刪除緩存失敗呢?

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

圖片

  • 第二種方案弊端:當(dāng)請求1執(zhí)行清除緩存后,還未執(zhí)行數(shù)據(jù)更新操作的時,請求2進來查詢到數(shù)據(jù)庫的舊數(shù)據(jù),并寫入了redis,這就導(dǎo)致了數(shù)據(jù)庫與redis數(shù)據(jù)不一致問題。
    1. t1線程先刪除緩存;
    2. t2線程讀取緩存為null,同步db數(shù)據(jù)到緩存中;
    3. t1線程更新db中的數(shù)據(jù);
    4. t3線程查詢緩存中數(shù)據(jù)是舊數(shù)據(jù);

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

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

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

4、需要注意的點

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

5、延遲的時間如何確定?

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

小結(jié)

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 存儲
    +關(guān)注

    關(guān)注

    13

    文章

    4266

    瀏覽量

    85685
  • 緩存
    +關(guān)注

    關(guān)注

    1

    文章

    233

    瀏覽量

    26649
  • 數(shù)據(jù)庫
    +關(guān)注

    關(guān)注

    7

    文章

    3767

    瀏覽量

    64279
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    802

    瀏覽量

    26452
  • Redis
    +關(guān)注

    關(guān)注

    0

    文章

    371

    瀏覽量

    10848
收藏 人收藏

    評論

    相關(guān)推薦

    Redis緩存和MySQL數(shù)據(jù)不一致原因和解決方案

    高并發(fā)架構(gòu)系列:Redis緩存和MySQL數(shù)據(jù)一致性方案詳解
    發(fā)表于 03-27 15:55

    Redis的內(nèi)存淘汰機制

    redis淘汰策略
    發(fā)表于 09-27 07:55

    淺析Redis的過期機制

    Redis數(shù)據(jù)過期策略詳解
    發(fā)表于 10-12 15:12

    簡單介紹MySQL延遲主從復(fù)制

    MySQL 5.6 已經(jīng)支持延遲復(fù)制, 可設(shè)置備節(jié)點的延遲時間, 延遲復(fù)制是有意義的,例如防止主節(jié)點數(shù)據(jù)誤刪,查看數(shù)據(jù)庫歷史狀態(tài)等。
    的頭像 發(fā)表于 02-09 09:05 ?4031次閱讀

    redis緩存mysql數(shù)據(jù)

    RedisMysql數(shù)據(jù)庫緩存,必須解決2個問題。首先,應(yīng)該確定用何種數(shù)據(jù)結(jié)構(gòu)存儲來自Mysql的數(shù)據(jù);在確定數(shù)據(jù)結(jié)構(gòu)之后,還要考慮用什么標識作為該數(shù)據(jù)結(jié)構(gòu)的鍵。
    的頭像 發(fā)表于 02-09 15:42 ?4041次閱讀

    RedisMySQL保持數(shù)據(jù)統(tǒng)一的方法介紹

    在高并發(fā)的業(yè)務(wù)場景下,數(shù)據(jù)庫大多數(shù)情況都是用戶并發(fā)訪問最薄弱的環(huán)節(jié)。所以,就需要使用redis做一個緩沖操作,讓請求先訪問到redis,而不是直接訪問MySQL等數(shù)據(jù)庫。
    的頭像 發(fā)表于 09-28 02:42 ?2213次閱讀
    <b class='flag-5'>Redis</b>和<b class='flag-5'>MySQL</b>保持數(shù)據(jù)統(tǒng)一的方法介紹

    mysql_redisMySQL中操作Redis?

    ./oschina_soft/gitee-mysql_redis.zip
    發(fā)表于 06-22 14:35 ?2次下載
    <b class='flag-5'>mysql_redis</b>在<b class='flag-5'>MySQL</b>中操作<b class='flag-5'>Redis</b>?

    先寫 Redis再寫 MySQL的區(qū)別

    請求 A、B 都是先寫 MySQL,然后再寫 Redis,在高并發(fā)情況下,如果請求 A 在寫 Redis 時卡了一會,請求 B 已經(jīng)依次完成數(shù)據(jù)的更新,就會出現(xiàn)圖中的問題。
    發(fā)表于 03-01 12:25 ?686次閱讀

    Redis10大性能優(yōu)化策略

    例如,我的機器配置比較低,當(dāng)延遲為 2ms 時,我就認為 Redis 變慢了,但是如果你的硬件配置比較高,那么在你的運行環(huán)境下,可能延遲是 0.5ms 時就可以認為 Redis 變慢了
    的頭像 發(fā)表于 07-04 10:21 ?814次閱讀
    <b class='flag-5'>Redis</b>10大性能優(yōu)化<b class='flag-5'>策略</b>

    Redis 的數(shù)據(jù)清理策略

    本文整理 Redis 的數(shù)據(jù)清理策略所有代碼來自 Redis version :5.0, 不同版本的 Redis 策略可能有調(diào)整
    發(fā)表于 09-19 14:24 ?359次閱讀
    <b class='flag-5'>Redis</b> 的數(shù)據(jù)清理<b class='flag-5'>策略</b>

    Redis的刪除策略和內(nèi)存淘汰機制介紹

    Redis過期鍵的刪除策略Redis的過期刪除策略就是:惰性刪除和定期刪除兩種策略配合使用。 惰性刪除:
    的頭像 發(fā)表于 10-09 11:06 ?470次閱讀

    SpringBoot AOP + Redis 延時功能實戰(zhàn)

    注意:要知道經(jīng)常修改的數(shù)據(jù)表不適合使用Redis,因為策略執(zhí)行的結(jié)果是把Redis中保存的那條數(shù)據(jù)刪除了,以后的查詢就都會去查詢數(shù)據(jù)庫。
    的頭像 發(fā)表于 10-13 16:08 ?618次閱讀
    SpringBoot AOP + <b class='flag-5'>Redis</b> 延時<b class='flag-5'>雙</b><b class='flag-5'>刪</b>功能實戰(zhàn)

    redismysql的區(qū)別

    RedisMySQL是兩種常見的數(shù)據(jù)庫管理系統(tǒng),兩者在很多方面存在差異,本文將詳細分析RedisMySQL的區(qū)別。 數(shù)據(jù)模型: Redis
    的頭像 發(fā)表于 11-16 11:21 ?1017次閱讀

    redismysql如何保持數(shù)據(jù)一致性

    RedisMySQL是兩個常用的數(shù)據(jù)庫系統(tǒng),它們都有自己的特點和用途。在某些場景下,我們可能需要將RedisMySQL進行結(jié)合使用,并保持數(shù)據(jù)的一致性。 一、
    的頭像 發(fā)表于 11-16 11:27 ?910次閱讀

    redis的淘汰策略

    Redis是一種基于內(nèi)存的鍵值存儲系統(tǒng),為了充分利用內(nèi)存,Redis采用了一些淘汰策略來管理內(nèi)存空間。淘汰策略的作用是當(dāng)內(nèi)存空間不足時,選擇合適的數(shù)據(jù)對象進行淘汰,釋放出更多的內(nèi)存空間
    的頭像 發(fā)表于 12-04 16:23 ?523次閱讀