在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

MySQL與Redis延遲雙刪策略

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

背景

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

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

1、什么是延遲雙刪?

延遲雙刪策略是分布式系統中數據庫存儲和緩存數據保持一致性的常用策略,但它不是強一致。其實不管哪種方案,都避免不了Redis存在臟數據的問題,只能減輕這個問題,要想徹底解決,得要用到同步鎖和對應的業務邏輯層面解決。

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

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

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

但是這兩種方案在并發請求中容易出現以下問題

圖片

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

1.不斷重試----如果是在http協議接口中 會導致接口響應變慢 調用該接口 會發生響應超時 2.或者通過mq異步的形式同步

圖片

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

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

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

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

4、需要注意的點

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

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

在業務程序運行時,統計業務邏輯執行讀數據和寫緩存的操作時間,以此為基礎來進行估算。因為這個方案會在第一次刪除緩存值后,延遲一段時間再次進行刪除,所以稱為“延遲雙刪”。

小結

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 存儲
    +關注

    關注

    13

    文章

    4314

    瀏覽量

    85851
  • 緩存
    +關注

    關注

    1

    文章

    240

    瀏覽量

    26679
  • 數據庫
    +關注

    關注

    7

    文章

    3799

    瀏覽量

    64396
  • MySQL
    +關注

    關注

    1

    文章

    809

    瀏覽量

    26574
  • Redis
    +關注

    關注

    0

    文章

    375

    瀏覽量

    10878
收藏 人收藏

    評論

    相關推薦

    Redis緩存和MySQL數據不一致原因和解決方案

    高并發架構系列:Redis緩存和MySQL數據一致性方案詳解
    發表于 03-27 15:55

    Redis的內存淘汰機制

    redis淘汰策略
    發表于 09-27 07:55

    淺析Redis的過期機制

    Redis數據過期策略詳解
    發表于 10-12 15:12

    簡單介紹MySQL延遲主從復制

    MySQL 5.6 已經支持延遲復制, 可設置備節點的延遲時間, 延遲復制是有意義的,例如防止主節點數據誤刪,查看數據庫歷史狀態等。
    的頭像 發表于 02-09 09:05 ?4049次閱讀

    redis緩存mysql數據

    RedisMysql數據庫緩存,必須解決2個問題。首先,應該確定用何種數據結構存儲來自Mysql的數據;在確定數據結構之后,還要考慮用什么標識作為該數據結構的鍵。
    的頭像 發表于 02-09 15:42 ?4061次閱讀

    RedisMySQL保持數據統一的方法介紹

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

    mysql_redisMySQL中操作Redis?

    ./oschina_soft/gitee-mysql_redis.zip
    發表于 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的區別

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

    Redis10大性能優化策略

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

    Redis 的數據清理策略

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

    Redis的刪除策略和內存淘汰機制介紹

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

    SpringBoot AOP + Redis 延時功能實戰

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

    redismysql的區別

    RedisMySQL是兩種常見的數據庫管理系統,兩者在很多方面存在差異,本文將詳細分析RedisMySQL的區別。 數據模型: Redis
    的頭像 發表于 11-16 11:21 ?1060次閱讀

    redismysql如何保持數據一致性

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

    redis的淘汰策略

    Redis是一種基于內存的鍵值存儲系統,為了充分利用內存,Redis采用了一些淘汰策略來管理內存空間。淘汰策略的作用是當內存空間不足時,選擇合適的數據對象進行淘汰,釋放出更多的內存空間
    的頭像 發表于 12-04 16:23 ?549次閱讀
    主站蜘蛛池模板: 视频免费1区二区三区| 美女视频黄a视频美女大全| 操操插插| 91福利网winktv| good韩国理论在线三级| 精品国产1000部91麻豆| 亚洲综合色一区| 91大神在线观看视频| 热99精品| 五夜婷婷| 日本三级特黄| 久久青草精品免费资源站| 国产精品久久久久网站| 午夜影视免费观看| 可以在线看黄的网站| 欧美另类xx| 福利一区二区在线观看| 四虎精品永久在线| 噜啪啪| ass嫩美女胴体| 日日操天天操夜夜操| 人人做人人爽人人爱秋霞影视| 久久久久久毛片免费播放| 无遮挡一级毛片| video另类蛇交| 国产高清免费在线观看| 男男失禁play 把尿bl| 女人张开腿给人桶免费视频| www射射一区| 97se狠狠狠狠狼亚洲综合网| 日本黄色小视频| aaa一级黄色片| 亚洲黄网站wwwwww| 色视频在线网站| 国产精品伦理一区二区三区| 永久黄色免费网站| 香蕉色网| 国产免费人成在线视频视频| 欧美成人全部费免网站| 性xxx中文视频| 人人草97|