首页 游戏 软件 资讯 排行榜 专题
首页
数据库
Redis删除缓存失败的原因和解决方案

Redis删除缓存失败的原因和解决方案

热心网友
26
转载
2026-04-30

今天咱们来探讨一个非常实际的线上问题:数据库明明已经更新成功了,但缓存删除却失败了,这时候该怎么办?

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

先给答案

如果你的项目里,缓存删除仅仅依赖于一句孤零零的 redis.del(key),那么数据一致性很大程度上是在“碰运气”。

一套更稳健的工程化做法,通常包含以下几个环节:

  1. 在主流程中,坚持“先写库,再删缓存”的顺序。
  2. 一旦删除失败,立即将任务丢入异步重试队列。
  3. 为重试设置上限,超过阈值则转入死信队列。
  4. 死信队列需要触发告警,并支持人工或自动补偿。
  5. 为整个链路打点监控,能清晰看到“删除失败率”和“补偿成功率”。

说到底,删除缓存不应该被看作一个孤立的动作,而是一条需要具备可观测性和可补偿性的完整链路。

为什么“删缓存失败”必须单独设计

很多开发者可能会想:“删失败了也没关系,下次读请求自然会回源数据库,重新加载正确的数据。”

在并发压力不大的情况下,这个逻辑看似成立。但到了线上高峰期,问题就会暴露出来:

  • 热点 Key 的旧缓存依然存在,大量用户会持续读到过时的数据。
  • 读流量越大,这个旧值传播得就越快、越广。
  • 如果没有有效的补偿机制,这些“脏数据”可能会在缓存中存活相当长的时间。

更棘手的是,这类问题通常不会立刻引发系统报错,而是以“偶发性用户投诉”、“后台数据对不上”等形式缓慢浮现,排查定位的成本非常高。

一个真实可落地的链路

Redis删除缓存失败的原因和解决方案

从这张图可以清晰地看到,整套方案的核心思路,已经从“如何删除”转变为“删除不掉时,如何兜底”。

代码示例:主流程 + 异步重试

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) 数据库是事实来源,先更新
        productMapper.updateById(product);
        // 2) 主流程同步删缓存,失败则发往重试队列
        try {
            redisTemplate.delete(key);
        } catch (Exception ex) {
            cacheDeleteProducer.sendDeleteEvent(key, 1);
        }
    }
}

2. 重试消费者(指数退避 + 最大次数)

@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. 死信补偿任务(定时巡检)

@Component
public class CacheDeleteCompensationJob {
    @Resource
    private DeadLetterRepository deadLetterRepository;
    @Resource
    private StringRedisTemplate redisTemplate;

    // 每 5 分钟执行一次补偿任务
    @Scheduled(cron = "0 */5 * * * ?")
    public void compensate() {
        List 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 个细节,决定你方案能不能用

幂等性

删除缓存操作天生具备幂等性,删除一个不存在的 Key 也应视为成功,无需当作异常处理。

重试上限

切忌无限重试。必须设定明确的阈值,超过后坚决转入死信队列,否则会造成隐性的消息堆积,拖垮整个系统。

退避策略

采用固定的短间隔(比如1秒)重试,容易在Redis短暂故障时形成“重试风暴”,将其打爆。使用指数退避策略(2秒、4秒、8秒…)更为稳健。

死信可见性

死信不等于丢弃。必须配备相应的告警机制和处理面板,让运维和开发能看见、能处理。

链路监控

至少需要监控以下几个核心指标:

  • cache_delete_fail_total(缓存删除失败总数)
  • cache_delete_retry_total(进入重试队列总数)
  • cache_delete_dlt_total(进入死信队列总数)
  • cache_delete_compensation_success_total(补偿成功总数)

常见误区

误区 1:删失败概率很低,可以忽略

线上环境总会遇到各种意外:网络瞬间抖动、Redis响应超时、连接池耗尽……这些情况并不罕见。

记住一个公式:低概率事件 × 高频请求 = 可观的事故数量。不能心存侥幸。

误区 2:有延迟双删就够了

延迟双删策略主要为了解决数据库主从延迟期间的缓存不一致问题,它无法替代针对删除操作本身失败而设计的重试补偿链路。两者解决的问题维度不同。

误区 3:死信就是失败,人工看就行

完全依赖人工监控死信队列,在深夜或节假日几乎必然会出现疏漏。理想的模式是“自动告警 + 自动补偿任务 + 人工巡检兜底”的三层防御。

选型建议(按团队规模)

团队阶段 推荐方案
小团队、单体服务 写库后删缓存 + 简单的本地重试(作为短期方案)
中型团队、多服务 写库后删缓存 + 消息队列(MQ)异步重试 + 死信告警
大团队、高一致性要求 事件驱动的一致性保障 + 统一的死信处理平台 + 自动补偿任务

最后总结

“删除缓存失败”绝非一个可以忽略的小概率边缘场景,它恰恰是保障缓存一致性的主战场之一。

一个真正能经受住线上流量考验的方案,通常具备以下四个特征:

  1. 主链路要快:核心流程(写库后删缓存)必须轻量、快速。
  2. 失败可恢复:通过异步重试机制,消化临时性故障。
  3. 极端可兜底:借助死信队列和补偿任务,处理持久性故障。
  4. 整体可观测:具备完整的监控指标和告警,做到心中有数。

把这四件事落实到位,你的缓存一致性策略就不再是“玄学”,而是扎实的、可衡量的工程能力。

来源:https://www.jb51.net/database/363114acb.htm
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

Redis删除缓存失败的原因和解决方案
数据库
Redis删除缓存失败的原因和解决方案

今天咱们来探讨一个非常实际的线上问题:数据库明明已经更新成功了,但缓存删除却失败了,这时候该怎么办? 先给答案 如果你的项目里,缓存删除仅仅依赖于一句孤零零的 redis del(key),那么数据一致性很大程度上是在“碰运气”。 一套更稳健的工程化做法,通常包含以下几个环节: 在主流程中,坚持“先

热心网友
04.30
快手电商订单数据自动导出方法与企业级自动化解决方案
业界动态
快手电商订单数据自动导出方法与企业级自动化解决方案

快手电商订单数据自动化导出:企业级提效与业财一体化实战指南 在直播电商浪潮席卷之下,快手电商无疑已成为众多品牌和商家至关重要的增长引擎。然而,随着店铺矩阵的扩张和日均订单量的攀升,一个看似基础却无比棘手的难题浮现出来:如何高效、精准地处理源源不断的订单与账单数据?这不仅关系到运营和财务团队的效率,更

热心网友
04.29
电商自动取数工具有哪些?主流工具对比与企业级解决方案
业界动态
电商自动取数工具有哪些?主流工具对比与企业级解决方案

电商自动取数工具全解析:如何打破数据孤岛,实现降本增效? 在全渠道电商运营时代,一个品牌往往需要同时布局淘宝、京东、抖音、拼多多、小红书等多个平台。运营人员和财务每天忙于登录数十个后台下载数据、合并报表,时间和人力成本居高不下。那么,有没有办法能把这套繁琐的“数据搬运”工作自动化呢? 答案就是电商自

热心网友
04.29
离散制造业智能自动化全场景落地解决方案详解
业界动态
离散制造业智能自动化全场景落地解决方案详解

离散制造业的智能自动化:从数据孤岛到端到端流畅 身处离散制造业的朋友都清楚,这个行当特点鲜明:产品门类多如繁星,生产流程时断时续,物料清单(BOM)更是复杂得像一团乱麻。在工业4 0的大背景下,一个核心难题愈发凸显——如何拆除系统间无形的数据高墙,让业务从起点到终点都能自动、丝滑地跑起来?这早已不是

热心网友
04.29
企业增值税发票验真与抵扣全流程自动化解决方案
业界动态
企业增值税发票验真与抵扣全流程自动化解决方案

在“数币时代”与“金税四期”的双重浪潮下:企业增值税发片管理走向何方? 眼下,企业增值税发片的管理,早已不是简单的合规记录。在“数币时代”与“金税四期”的深度推进下,一场从“合规”到“精细化、自动化控制”的全流程变革正在发生。所谓增值税发片验真与抵扣全流程自动化,其目标正是通过集成OCR、RPA乃至

热心网友
04.29

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

关于天气的农谚
职业与学业
关于天气的农谚

清明刮了坟头土,沥沥拉拉四十五。 这些流传已久的农谚,可不是随口说说的顺口溜,它们是千百年来农耕文明与自然对话的结晶,是写在时间里的“天气备忘录”。一句句简短的话语,背后藏着的是对节气、物候与农事活动之间精密联系的深刻洞察。 节气与农事 先看清明和谷雨这对“搭档”。老话说,“清明要晴,谷雨要淋”。清

热心网友
04.30
经典的励志语句
职业与学业
经典的励志语句

人生伟业的建立,不在能知,乃在能行。 仔细想想,真正的阻碍往往并非来自外界,而是源于内心。任何的限制,其实都是从自己的内心开始的。 那么,我们该如何突破呢?不妨先从一个简单的行动开始:如果我们都去专注地做那些自己能做到的事情,最终的结果,往往会让自己大吃一惊。 行动固然重要,但人终究是社会性的存在。

热心网友
04.30
描写春雨的优美句子
职业与学业
描写春雨的优美句子

亮晶晶的春雨 你听,那是什么声音?是欢快的打击乐,还是轻盈的舞步?原来,是一群天真烂漫的娃娃——亮晶晶的春雨,正在高空中云集。它们嬉戏着,咿咿呀呀地欢唱着,然后一股脑儿地、欢蹦乱跳地扑向大地母亲的怀抱。 这春雨,可不只是娃娃们的嬉闹。它绵绵不绝,细细密密,像极了巧手姑娘使用的花针与丝线。它们斜斜地交

热心网友
04.30
赞扬母亲的句子
职业与学业
赞扬母亲的句子

母亲的爱是世间最伟大的爱,也是最珍贵的爱 母爱,常常藏匿于那些看似微不足道的日常琐碎里。它或许没有惊天动地的形式,却如涓涓细流,汇聚成永恒的生命之源。 该如何形容这种无处不在的守护呢?春天,她是拂面的和风,送来丝丝暖意;夏日,她是那口沁凉的冰淇淋,带来纯粹的快乐;秋时,她化作枝头那片悄然飘落的黄叶,

热心网友
04.30
描写花的好句子
职业与学业
描写花的好句子

一列美人蕉 盛开着红色、黄色而带着黑斑的大朵的花,正伸张了大口,向着灿烂的春光微笑。远远望去,美人蕉的花簇像一团团燃烧得正旺的火焰,充满了生命力;凑近细看,每一朵又宛如小姑娘发间俏丽的红蝴蝶结,透着几分活泼与羞涩。至于它那宽大的叶子,则像极了一把把撑开的绿色芭蕉扇,在风中轻轻摇曳。 看着这些盛开的花

热心网友
04.30