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

Redis刪除緩存失敗的原因和解決方案

 更新時間:2026年04月30日 08:52:01   作者:014-code  
本文討論了數(shù)據(jù)庫操作成功但緩存刪除失敗時,線上環(huán)境下的應(yīng)對策略,提出了一種更穩(wěn)定的方法,包括主流程寫庫后再刪除緩存、刪除失敗進入重試隊列、超過重試上限進入死信隊列并觸發(fā)告警和補償?shù)却胧?需要的朋友可以參考下

這篇聊一個很現(xiàn)實的問題:數(shù)據(jù)庫已經(jīng)改成功了,但緩存刪除失敗了,線上怎么辦?

先給答案

如果你項目里只有一句 redis.del(key),那一致性是靠運氣。

一套更穩(wěn)的做法是:

  1. 主流程里先寫庫再刪緩存
  2. 刪除失敗立刻進入重試隊列
  3. 超過重試上限進入死信隊列
  4. 死信觸發(fā)告警和人工/自動補償
  5. 全鏈路打點,能看見“刪失敗率”和“補償成功率”

一句話:刪除緩存不是一個動作,而是一條可觀測、可補償?shù)逆溌贰?/strong>

為什么“刪緩存失敗”必須單獨設(shè)計

很多同學(xué)會說:“刪失敗就下次再讀庫唄。”

這句話在低并發(fā)時看起來沒毛病,但線上高峰期會出事:

  • 熱點 key 還在,用戶繼續(xù)讀到舊值
  • 讀流量越大,舊值傳播越快
  • 你又沒有補償機制,臟數(shù)據(jù)會“活很久”

最麻煩的是:這個問題不會立刻報錯,而是以“偶發(fā)投訴”“數(shù)據(jù)不對”的形式出現(xiàn),排查成本很高。

一個真實可落地的鏈路

你會發(fā)現(xiàn),核心不是“怎么刪”,而是“刪不掉時怎么兜”。

代碼示例:主流程 + 異步重試

1. 主流程(寫庫后刪緩存)

@Service
public class ProductService {
    @Resource
    private ProductMapper productMapper;
    @Resource
    private StringRedisTemplate redisTemplate;
    @Resource
    private CacheDeleteProducer cacheDeleteProducer;
    @Transactional(rollbackFor = Exception.class)
    public void updateProduct(Product product) {
        String key = "product:" + product.getId();
        // 1) 數(shù)據(jù)庫是事實來源
        productMapper.updateById(product);
        // 2) 主流程刪緩存,失敗則入重試隊列
        try {
            redisTemplate.delete(key);
        } catch (Exception ex) {
            cacheDeleteProducer.sendDeleteEvent(key, 1);
        }
    }
}

2. 重試消費者(指數(shù)退避 + 最大次數(shù))

@Component
public class CacheDeleteConsumer {
    private static final int MAX_RETRY = 5;
    @Resource
    private StringRedisTemplate redisTemplate;
    @Resource
    private CacheDeleteProducer cacheDeleteProducer;
    @Resource
    private DeadLetterProducer deadLetterProducer;
    public void onMessage(CacheDeleteEvent event) {
        try {
            redisTemplate.delete(event.getCacheKey());
            // 打點:delete_success_total +1
        } catch (Exception ex) {
            int nextRetry = event.getRetryCount() + 1;
            if (nextRetry > MAX_RETRY) {
                deadLetterProducer.send(event.getCacheKey(), ex.getMessage());
                return;
            }
            long delaySeconds = (long) Math.pow(2, nextRetry); // 2,4,8,16,32
            cacheDeleteProducer.sendDeleteEvent(event.getCacheKey(), nextRetry, delaySeconds);
        }
    }
}

3. 死信補償任務(wù)(定時巡檢)

@Component
public class CacheDeleteCompensationJob {
    @Resource
    private DeadLetterRepository deadLetterRepository;
    @Resource
    private StringRedisTemplate redisTemplate;
    // 每 5 分鐘跑一次
    @Scheduled(cron = "0 */5 * * * ?")
    public void compensate() {
        List<DeadLetterRecord> records = deadLetterRepository.queryUnresolved(200);
        for (DeadLetterRecord record : records) {
            try {
                redisTemplate.delete(record.getCacheKey());
                deadLetterRepository.markResolved(record.getId());
            } catch (Exception e) {
                deadLetterRepository.increaseFailCount(record.getId(), e.getMessage());
            }
        }
    }
}

這 5 個細(xì)節(jié),決定你方案能不能用

冪等性
刪緩存天生冪等,刪不存在 key 也算成功,別把它當(dāng)異常。

重試上限
不要無限重試,超過閾值必須死信,不然就是隱性消息堆積。

退避策略
固定 1 秒重試容易打爆 Redis,用指數(shù)退避更穩(wěn)。

死信可見性
死信不等于丟棄,要有告警和處理面板。

鏈路監(jiān)控
至少要有這幾個指標(biāo):

  • cache_delete_fail_total
  • cache_delete_retry_total
  • cache_delete_dlt_total
  • cache_delete_compensation_success_total

常見誤區(qū)

誤區(qū) 1:刪失敗概率很低,可以忽略

線上你總會遇到:網(wǎng)絡(luò)抖動、Redis 短暫超時、連接池耗盡。
低概率 * 高頻請求 = 可觀事故數(shù)。

誤區(qū) 2:有延遲雙刪就夠了

延遲雙刪只能覆蓋一部分并發(fā)窗口,無法替代失敗重試鏈路

誤區(qū) 3:死信就是失敗,人工看就行

只靠人工盯死信,夜里一定會漏。
最好是“告警 + 自動補償 + 人工兜底”三層。

選型建議(按團隊規(guī)模)

團隊階段推薦方案
小團隊、單體服務(wù)寫庫后刪緩存 + 本地重試(短期)
中型團隊、多服務(wù)寫庫后刪緩存 + MQ 重試 + 死信告警
大團隊、高一致性要求事件驅(qū)動一致性 + 死信平臺 + 自動補償任務(wù)

最后總結(jié)

“刪除緩存失敗”不是小概率邊角料,它是緩存一致性的主戰(zhàn)場。

真正能扛線上流量的方案,通常長這樣:

  1. 主鏈路快:寫庫后刪緩存
  2. 失敗可恢復(fù):異步重試
  3. 極端可兜底:死信補償
  4. 整體可觀測:指標(biāo)和告警

把這四件事做到位,你的緩存一致性就不是“玄學(xué)”,而是工程能力。

以上就是Redis刪除緩存失敗的原因和解決方案的詳細(xì)內(nèi)容,更多關(guān)于Redis刪除緩存失敗的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • redis中redisson實現(xiàn)鎖自動延時

    redis中redisson實現(xiàn)鎖自動延時

    redisson作為分布式鎖能夠解決分布式的加鎖解鎖問題,還能夠?qū)崿F(xiàn)鎖的設(shè)置存活時間以及自動續(xù)期,本文主要介紹了redis中redisson實現(xiàn)鎖自動延時,感興趣的可以了解一下
    2024-02-02
  • 從源碼解讀redis持久化

    從源碼解讀redis持久化

    redis的持久化也就是數(shù)據(jù)落地,對于任何一個數(shù)據(jù)系統(tǒng)都要考慮是不是需要數(shù)據(jù)落地。在系統(tǒng)崩潰或是機房掉電等的情況下,將有用的數(shù)據(jù)記錄在非易失性存儲器上面,防止數(shù)據(jù)丟失,以及用來系統(tǒng)重啟時的數(shù)據(jù)恢復(fù)。
    2018-08-08
  • 在K8s上部署Redis集群的方法步驟

    在K8s上部署Redis集群的方法步驟

    這篇文章主要介紹了在K8s上部署Redis集群的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Redis集群水平擴展、集群中添加以及刪除節(jié)點的操作

    Redis集群水平擴展、集群中添加以及刪除節(jié)點的操作

    這篇文章主要介紹了Redis集群水平擴展、集群中添加以及刪除節(jié)點的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Redis指南及6.2.x版本安裝過程

    Redis指南及6.2.x版本安裝過程

    Redis?是完全開源免費的,遵守BSD協(xié)議,是一個高性能(NOSQL)的key-value數(shù)據(jù)庫,Redis是一個開源的使用ANSI?C語言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API,本文給大家介紹Redis介紹及6.2.x版本安裝,感興趣的朋友一起看看吧
    2025-06-06
  • redis?手機驗證碼實現(xiàn)示例

    redis?手機驗證碼實現(xiàn)示例

    本文主要介紹了redis?手機驗證碼實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • redis實現(xiàn)主從模式(1主2從)

    redis實現(xiàn)主從模式(1主2從)

    本文主要介紹了在Windows環(huán)境下搭建和測試Redis的主從復(fù)制模式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • Redis自增生成id的方法實踐

    Redis自增生成id的方法實踐

    在使用Redis時,常常需要用到自增ID的功能,主要介紹了Redis自增生成id的方法實踐,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • Redis和Lua使用過程中遇到的小問題

    Redis和Lua使用過程中遇到的小問題

    這篇文章主要給大家介紹了關(guān)于Redis和Lua使用過程中遇到的小問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Redis02 使用Redis數(shù)據(jù)庫(String類型)全面解析

    Redis02 使用Redis數(shù)據(jù)庫(String類型)全面解析

    這篇文章主要介紹了Redis02 使用Redis數(shù)據(jù)庫(String類型)全面解析的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-07-07

最新評論

乐陵市| 尼玛县| 平利县| 木里| 邵阳市| 东明县| 龙江县| 碌曲县| 沁阳市| 聂拉木县| 长沙市| 石嘴山市| 莆田市| 措美县| 五寨县| 新津县| 府谷县| 临沭县| 汕头市| 开远市| 邳州市| 沛县| 泗水县| 敦煌市| 观塘区| 辽宁省| 绍兴市| 保康县| 垫江县| 台湾省| 健康| 新竹市| 贵德县| 台江县| 当雄县| 盐边县| 内乡县| 怀远县| 临西县| 尖扎县| 衡阳市|