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

Redis和數(shù)據(jù)庫(kù)雙寫(xiě)一致性問(wèn)題的解決方案

 更新時(shí)間:2025年08月06日 08:48:41   作者:Java自學(xué)之旅  
文章探討了Redis與數(shù)據(jù)庫(kù)雙寫(xiě)一致性問(wèn)題,提出四種解決方案:先更新數(shù)據(jù)庫(kù)再刪除緩存(推薦),延時(shí)雙刪避免并發(fā)不一致,監(jiān)聽(tīng)數(shù)據(jù)庫(kù)變更實(shí)現(xiàn)最終一致性,加分布式鎖保障強(qiáng)一致,核心原則是優(yōu)先保證數(shù)據(jù)庫(kù)正確性,緩存操作可失敗重試,強(qiáng)一致性需犧牲性能

下面我將詳細(xì)解答Redis與數(shù)據(jù)庫(kù)雙寫(xiě)一致性問(wèn)題,結(jié)合故事舉例說(shuō)明,最后用思維導(dǎo)圖總結(jié)核心解決方案。

問(wèn)題解答

核心問(wèn)題:當(dāng)同時(shí)更新Redis緩存和數(shù)據(jù)庫(kù)時(shí),由于網(wǎng)絡(luò)延遲、操作順序等問(wèn)題導(dǎo)致數(shù)據(jù)不一致。

解決方案(含故事舉例)

假設(shè)電商平臺(tái)有商品庫(kù)存系統(tǒng):

// 商品服務(wù)類(lèi)
public class ProductService {
    private DB db = new MySQL();  // 數(shù)據(jù)庫(kù)
    private Cache cache = new Redis();  // 緩存
}

1. 先更新數(shù)據(jù)庫(kù),再刪除緩存(推薦方案)

public void updateProduct(Product product) {
    db.update(product);          // 1. 更新數(shù)據(jù)庫(kù)
    cache.delete(product.getId());// 2. 刪除緩存
}

故事場(chǎng)景

管理員修改商品價(jià)格(100→80元):

  • 數(shù)據(jù)庫(kù)先更新為80元 ?
  • 刪除Redis中該商品的緩存

用戶查詢時(shí):

  • 緩存未命中 → 讀數(shù)據(jù)庫(kù)(80元) ?
  • 回填緩存(80元) ?

優(yōu)勢(shì)

  • 避免"更新緩存失敗導(dǎo)致永久不一致"
  • 緩存刪除失敗可重試(通過(guò)消息隊(duì)列)

風(fēng)險(xiǎn)

并發(fā)時(shí)短暫不一致(概率低):

  • 用戶A讀緩存(空) → 讀數(shù)據(jù)庫(kù)(100元)
  • 管理員更新數(shù)據(jù)庫(kù)(100→80) → 刪緩存
  • 用戶A寫(xiě)緩存(100元) ?(舊數(shù)據(jù))
  • 解決方案:延時(shí)雙刪(下文說(shuō)明)

2. 延時(shí)雙刪策略

public void updateWithDelay(Product product) {
    cache.delete(product.getId());    // 1. 先刪緩存
    db.update(product);               // 2. 更新數(shù)據(jù)庫(kù)
    Thread.sleep(500);                // 3. 等待500ms
    cache.delete(product.getId());    // 4. 再刪緩存
}

故事場(chǎng)景

解決上述并發(fā)問(wèn)題:

  • 首次刪除:清空舊緩存
  • 更新數(shù)據(jù)庫(kù) ?
  • 等待期間可能寫(xiě)入的舊緩存被二次刪除 ?→?

3. 監(jiān)聽(tīng)數(shù)據(jù)庫(kù)變更(最終一致性)

// 使用Canal監(jiān)聽(tīng)MySQL binlog
canal.subscribe(event -> {
    if (event.isUpdate()) {
        cache.delete(event.getKey()); // 異步刪除緩存
    }
});

故事場(chǎng)景

訂單系統(tǒng)庫(kù)存變更:

  • 數(shù)據(jù)庫(kù)減庫(kù)存 ?
  • Canal捕獲變更事件
  • 自動(dòng)刪除Redis庫(kù)存緩存
  • 下次查詢回填最新值 ?

4. 加分布式鎖(強(qiáng)一致)

public void safeUpdate(Product product) {
    Lock lock = redisson.getLock("PRODUCT_" + product.getId());
    lock.lock();
    try {
        db.update(product);
        cache.update(product); // 同時(shí)更新緩存
    } finally {
        lock.unlock();
    }
}

適用場(chǎng)景

金融賬戶余額等強(qiáng)一致性要求:

  • 讀寫(xiě)操作串行化
  • 性能較低(非高并發(fā)場(chǎng)景)

總結(jié)對(duì)比

方案一致性性能復(fù)雜度適用場(chǎng)景
先DB后刪緩存最終★★★★大部分業(yè)務(wù)
延時(shí)雙刪最終★★★高并發(fā)場(chǎng)景
監(jiān)聽(tīng)binlog最終★★★★異構(gòu)系統(tǒng)同步
分布式鎖強(qiáng)一致★★金融/賬戶系統(tǒng)

核心原則

  • 優(yōu)先保證數(shù)據(jù)庫(kù)正確性
  • 緩存操作可失敗/重試
  • 強(qiáng)一致性需犧牲性能

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

  • Redis批量查詢的四種方式詳解

    Redis批量查詢的四種方式詳解

    在高并發(fā)場(chǎng)景下,巧妙地利用緩存批量查詢技巧能夠顯著提高系統(tǒng)性能,熟練掌握細(xì)粒度的緩存使用是每位架構(gòu)師必備的技能,因此,在本文中,我們將深入探討 Redis 中批量查詢的一些技巧,希望能夠給你帶來(lái)一些啟發(fā),需要的朋友可以參考下
    2025-10-10
  • Redis進(jìn)行相關(guān)優(yōu)化詳解

    Redis進(jìn)行相關(guān)優(yōu)化詳解

    這篇文章主要介紹了Redis進(jìn)行相關(guān)優(yōu)化,Redis在項(xiàng)目中進(jìn)行廣泛使用,那么在日常的開(kāi)發(fā)過(guò)程中,我們?cè)谑褂肦edis的過(guò)程中需要注意那些呢?本文將從三個(gè)維度來(lái)講解如何進(jìn)行Redis的優(yōu)化
    2022-08-08
  • Redis中的延遲雙刪

    Redis中的延遲雙刪

    這篇文章主要介紹了Redis中的延遲雙刪問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • redis分布式鎖之可重入鎖的實(shí)現(xiàn)代碼

    redis分布式鎖之可重入鎖的實(shí)現(xiàn)代碼

    相信大家都知道可重入鎖的作用防止在同一線程中多次獲取鎖而導(dǎo)致死鎖發(fā)生,本文通過(guò)幾個(gè)例子給大家分享redis分布式鎖之可重入鎖的實(shí)現(xiàn)代碼,對(duì)redis分布式鎖的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2021-05-05
  • 深入理解Redis 內(nèi)存管理

    深入理解Redis 內(nèi)存管理

    本文主要介紹了深入理解Redis 內(nèi)存管理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02
  • Redis過(guò)期數(shù)據(jù)的刪除策略詳解

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

    Redis 是一個(gè)kv型數(shù)據(jù)庫(kù),我們所有的數(shù)據(jù)都是存放在內(nèi)存中的,但是內(nèi)存是有大小限制的,不可能無(wú)限制的增量,這篇文章主要介紹了Redis過(guò)期數(shù)據(jù)的刪除策略,需要的朋友可以參考下
    2023-08-08
  • Redis實(shí)現(xiàn)分布式隊(duì)列淺析

    Redis實(shí)現(xiàn)分布式隊(duì)列淺析

    Redis將數(shù)據(jù)存儲(chǔ)在內(nèi)存中,使得讀寫(xiě)速度非常快,經(jīng)常被用來(lái)做緩存系統(tǒng),這里我們將redis用來(lái)做一個(gè)分布式的消息隊(duì)列。這篇文章主要介紹了使用redis來(lái)作為消息隊(duì)列,并且進(jìn)行分布式主從配置,有需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2016-11-11
  • 使用寶塔在服務(wù)器上配置Redis的詳細(xì)圖文教程

    使用寶塔在服務(wù)器上配置Redis的詳細(xì)圖文教程

    這篇文章主要給大家介紹了關(guān)于使用寶塔在服務(wù)器上配置Redis的相關(guān)資料,包括下載和安裝Redis,開(kāi)放端口,修改配置文件以允許遠(yuǎn)程訪問(wèn)和設(shè)置密碼,該過(guò)程對(duì)于理解Redis在項(xiàng)目部署中的配置提供了實(shí)用指導(dǎo),需要的朋友可以參考下
    2024-11-11
  • 最新評(píng)論

    股票| 金山区| 凌源市| 东方市| 图们市| 大庆市| 科技| 遵义县| 达州市| 广州市| 江源县| 错那县| 开封县| 克拉玛依市| 灵寿县| 石城县| 武强县| 广南县| 瓦房店市| 武安市| 沭阳县| 茂名市| 固安县| 枣强县| 东宁县| 高要市| 仲巴县| 司法| 乐东| 新和县| 罗城| 临汾市| 庆安县| 太和县| 穆棱市| 辽阳县| 靖边县| 康平县| 富蕴县| 贵港市| 新疆|