亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySQL數據庫和Redis緩存一致性的更新策略

 更新時間:2023年04月12日 09:34:08   作者:哪 吒  
本文主要介紹了MySQL數據庫和Redis緩存一致性的更新策略問題,文中有詳細的代碼示例,有需要的朋友可以參考一下

一、更新策略

1、如果Redis中有數據,需要和數據庫中的值相同。

2、如果Redis中無數據,數據庫中的最新值要對Redis進行同步更新。

二、讀寫緩存

1、同步直寫策略

寫入數據庫也同步寫Redis緩存,緩存和數據庫中的數據一致;對于讀寫緩存來說,要保證緩存和數據庫中的數據一致,就要保證同步直寫策略。

2、異步緩寫策略

某些業(yè)務運行中,MySQL數據更新之后,允許在一定時間后再進行Redis數據同步,比如物流系統(tǒng)。

當出現異常情況時,不得不將失敗的動作重新修補,需要借助rabbitmq或kafka進行重寫。

三、雙檢加鎖策略

多個線程同時去查詢數據庫的這條數據,那么我們可以在第一個查詢數據的請求上使用一個 互斥鎖來鎖住它。

其他的線程走到這一步拿不到鎖就等著,等第一個線程查詢到了數據,然后做緩存。

后面的線程進來發(fā)現已經有緩存了,就直接走緩存。

public String get(String key){
    // 從Redis緩存中讀取
    String value = redisTemplate.get(key);

    if(value != null){
        return value;
    }

    synchronized (RedisTest.class){
        // 重新嘗試從Redis緩存中讀取
        value = redisTemplate.get(key);
        if(value != null){
            return value;
        }

        // 從MySQL數據庫中查詢
        value = studentDao.get(key);
        // 寫入Redis緩存
        redisTemplate.setnx(key,value,time);
        return value;
    }
}

四、數據庫和緩存一致性的更新策略

1、先更新數據庫,再更新Redis

按照常理出牌的話,應該都是如此吧?那么,這種情況下,會有啥問題呢?

如果更新數據庫成功后,更新Redis之前異常了,會出現什么情況呢?

數據庫與Redis內緩存數據不一致。

2、先更新緩存,再更新數據庫

多線程情況下,會有問題。

比如

  • 線程1更新redis = 200;
  • 線程2更新redis = 100;
  • 線程2更新MySQL = 100;
  • 線程1更新MySQL = 200;

結果呢,Redis=100、MySQL=200;我擦!

3、先刪除緩存,再更新數據庫

線程1刪除了Redis的緩存數據,然后去更新MySQL數據庫;
還沒等MySQL更新完畢,線程2殺來,讀取緩存數據;
但是,此時MySQL數據庫還沒更新,線程2讀取了MySQL中的舊值,然后線程2,還會將舊值寫入Redis作為數據緩存;
線程1更新完MySQL數據后,發(fā)現Redis中已經有數據了,之前都刪過了,那我就不更新了;
完蛋了。。

延時雙刪

延時雙刪可以解決上面的問題,只要sleep的時間大于線程2讀取數據再寫入緩存的時間就可以了,也就是線程1的二次清緩存操作要在線程2寫入緩存之后,這樣才能保證Redis緩存中的數據是最新的。

/**
 * 延時雙刪
 * @autor 哪吒編程
 */
public void deleteRedisData(Student stu){
    // 刪除Redis中的緩存數據
    jedis.del(stu);

    // 更新MySQL數據庫數據
    studentDao.update(stu);

    // 休息兩秒
    try {
        TimeUnit.SECONDS.sleep(2);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    // 刪除Redis中的緩存數據
    jedis.del(stu);
}

延遲雙刪最大的問題就是sleep,在效率為王的今天,sleep能不用還是不用為好。

你不睡我都嫌你慢,你還睡上了…

4、先更新數據庫,再刪除緩存

  1. 線程1先更新數據庫,再刪除Redis緩存;
  2. 線程2在線程1刪除Redis緩存之前發(fā)起請求,得到了未刪除的Redis緩存;
  3. 線程1此時才刪除Redis緩存數據;

問題還是有,這翻來覆去的,沒完沒了了。

這種情況如何解決呢?

引入消息中間件解決戰(zhàn)斗,再一次詳細的復盤一下。

  1. 更新數據庫;
  2. 數據庫將操作信息寫入binlog日志;
  3. 訂閱程序提取出key和數據;
  4. 嘗試刪除緩存操作,發(fā)現刪除失?。?/li>
  5. 將這些數據信息發(fā)送到消息中間件中;
  6. 從消息中間件中獲取該數據,重新操作;

5、總結

哪吒推薦使用第四種方式,先更新數據庫,再刪除緩存。

方式①和方式②缺點太過明顯,不考慮;
方式③中的sleep,總是讓人頭疼;
方式④是一個比較全面的方案,但是增加了學習成本、維護成本,因為增加了消息中間件。

五、MySQL主從復制工作原理

1、當 master 主服務器上的數據發(fā)生改變時,則將其改變寫入二進制事件日志文件中;

2、salve 從服務器會在一定時間間隔內對 master 主服務器上的二進制日志進行探測,探測其是否發(fā)生過改變,

如果探測到 master 主服務器的二進制事件日志發(fā)生了改變,則開始一個 I/O Thread 請求 master 二進制事件日志;

3、同時 master 主服務器為每個 I/O Thread 啟動一個dump Thread,用于向其發(fā)送二進制事件日志;

4、slave 從服務器將接收到的二進制事件日志保存至自己本地的中繼日志文件中;

5、salve 從服務器將啟動 SQL Thread 從中繼日志中讀取二進制日志,在本地重放,使得其數據和主服務器保持一致;

6、最后 I/O Thread 和 SQL Thread 將進入睡眠狀態(tài),等待下一次被喚醒;

到此這篇關于MySQL數據庫和Redis緩存一致性的更新策略的文章就介紹到這了,更多相關MySQL和Redis緩存一致性內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Mysql8.0.22解壓版安裝教程(小白專用)

    Mysql8.0.22解壓版安裝教程(小白專用)

    這篇文章主要介紹了Mysql8.0.22解壓版安裝教程(小白專用),文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • MySQL 如何連接對應的客戶端進程

    MySQL 如何連接對應的客戶端進程

    這篇文章主要介紹了MySQL 如何連接對應的客戶端進程,幫助大家更好的理解和學習MySQL,感興趣的朋友可以了解下
    2020-11-11
  • 將MySQL從MyISAM轉換成InnoDB錯誤和解決辦法

    將MySQL從MyISAM轉換成InnoDB錯誤和解決辦法

    原來自己用的是為了裝的, 所以在設置database usage(如下圖1)的時候按照discuz官方的建議,選的都是Non-Transactional Database Only(只支持MyISAM數據引擎的非事務數據庫),用MyISAM數據庫,還沒涉及到需要InnoDB,因此打算直接不加載INNODB引擎。
    2011-09-09
  • Mysql常見bug及解決方案超詳細講解

    Mysql常見bug及解決方案超詳細講解

    在使用MySQL的過程中,相比大家都踩過不少坑,下面這篇文章主要給大家介紹了關于Mysql常見bug及解決方案超詳細講解的相關資料,文中介紹的非常詳細,需要的朋友可以參考下
    2023-06-06
  • mysql常用函數之group_concat()、group by、count()、case when then的使用

    mysql常用函數之group_concat()、group by、count()、case whe

    本文主要介紹了mysql常用函數之group_concat()、group by、count()、case when then的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • MySQL的安裝與配置詳細教程

    MySQL的安裝與配置詳細教程

    MySQL是一種關系數據庫管理系統(tǒng),所使用的 SQL 語言是用于訪問數據庫的最常用的,本文主要以Mysql免安裝版為例,幫助大家解決安裝與配置mysql的步驟
    2021-06-06
  • MySQL中使用distinct單、多字段去重方法

    MySQL中使用distinct單、多字段去重方法

    多個字段拼接去重是指將多個字段的值按照一定的規(guī)則進行拼接,并去除重復的拼接結果,本文主要介紹了MySQL中使用distinct單、多字段去重方法,感興趣的可以了解一下
    2024-05-05
  • 從其他電腦訪問本機的Mysql的設置方法

    從其他電腦訪問本機的Mysql的設置方法

    如果需要讓特定的用戶從給定域(例如mydomain.com)的所有計算機上訪問 MySQL 服務器,你可以執(zhí)行在賬戶名的 host 部分使用了通配符“%” 的 GRANT 語句
    2008-11-11
  • 關于Win10下MySQL5.7.17免安裝版基本配置教程(圖文詳解)

    關于Win10下MySQL5.7.17免安裝版基本配置教程(圖文詳解)

    這數據庫應用是一個應用系統(tǒng)不可或缺的部分,關系型數據庫應用大同小異,這里選擇MySQL作為數據庫平臺。下面通過本文給大家介紹關于Win10下MySQL5.7.17免安裝版基本配置教程(圖文詳解),需要的朋友可以參考下
    2017-06-06
  • mysql解決遠程不能訪問的二種方法

    mysql解決遠程不能訪問的二種方法

    mysql解決遠程不能訪問的二種方法,需要的朋友可以參考一下
    2013-04-04

最新評論