首页 游戏 软件 资讯 排行榜 专题
首页
数据库
Redis延迟双删策略实现方法与实战示例

Redis延迟双删策略实现方法与实战示例

热心网友
73
转载
2026-05-08

在缓存与数据库协同工作的经典模式中,Cache-Aside(旁路缓存)策略因其简洁高效而被广泛采用。然而,在高并发场景下,一个棘手的问题常常浮出水面:并发读写可能导致缓存被回填旧值,从而引发数据不一致。为了解决这个痛点,延迟双删(Delayed Double Deletion)方案应运而生,它是对Cache-Aside策略的一次重要加固。

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

Redis延迟双删的实现示例

一、问题根源:为何必须引入双删策略?

要深入理解延迟双删的价值,必须首先剖析它在高并发下所要解决的核心难题。无论是“先删缓存再更新数据库”,还是“先更新数据库再删缓存”,在并发读写交织的环境下都可能失效。

先分析第一种典型情况(先删缓存,再更新DB):

并发时序分析

t1:线程A(执行写操作)首先删除缓存。
t2:线程B(执行读操作)查询缓存,结果未命中。
t3:线程B转而查询数据库,此时数据库内仍为旧数据。
t4:线程A完成数据库更新,写入新值。
t5:线程B将查询到的旧值回填至缓存。

最终结果是,缓存中持久化了一份过时的“脏数据”,导致后续所有读请求获取错误信息。

那么,调换顺序是否可行?“先更新DB再删缓存”同样存在风险,尤其是在存在主从延迟的数据库架构中:

并发时序分析

t1:线程A更新主库数据。
t2:线程B查询从库(由于主从延迟,读到的仍是旧值)。
t3:线程A执行缓存删除操作。
t4:线程B将读到的旧值写入缓存。

问题的核心症结在于,在“首次删除缓存”与“后续读请求回填缓存”这两个动作之间,存在一个不可控的时间窗口。延迟双删的核心思想,就是主动引入一个“等待期”,让这个时间窗口内所有可能回填旧值的并发读请求都执行完毕,再进行第二次清理,从而确保缓存数据的最终一致性。

二、延迟双删的具体实现步骤

该方案的执行流程清晰直观,可概括为四个核心步骤:

1. 首次删除缓存:立即清除缓存中的旧数据,触发后续读请求回填。
2. 更新数据库:完成核心数据的持久化变更。
3. 休眠/等待特定时长:这是方案的关键,等待时间需根据业务精心设计。
4. 再次删除缓存:清理掉等待期间可能被回填的旧值,确保一致性。

通过Python代码演示,其逻辑会更加明确:

import time

def update_with_delayed_double_deletion(key, new_value):
    # 第一步:首次删除缓存
    redis.delete(key)
    # 第二步:更新数据库
    db.update(key, new_value)
    # 第三步:关键延迟等待(例如500毫秒,具体需根据业务调整)
    time.sleep(0.5)
    # 第四步:第二次删除缓存(清除可能回填的旧数据)
    redis.delete(key)

三、核心参数:延迟时间如何科学设定?

整个方案的效果,高度依赖于第三步的等待时间。时间过短,可能无法覆盖所有并发读操作;时间过长,则会不必要地阻塞写请求,影响系统吞吐量和性能。

那么,这个延迟时间该如何进行科学估算呢?一个业界常用的经验公式是:

延迟时间 ≈ 主从同步延迟 + 业务读操作耗时 + 安全冗余时间

  • 主从同步延迟:若数据库采用主从架构,此因素必须纳入考量。通常延迟在100毫秒至500毫秒之间。
  • 业务读操作耗时:涵盖从查询数据库、业务逻辑处理、数据序列化到网络传输的完整链路时间。
  • 安全冗余时间:为保障可靠性,通常建议额外增加100到200毫秒的缓冲余量。

基于此,我们可以给出一些实践性建议:

  • 对于无主从架构的单库场景,设置100-300毫秒的延迟通常足够。
  • 对于存在主从复制的场景,建议将延迟设置在300-800毫秒范围。
  • 在高并发或业务链路复杂的系统中,最佳实践是结合实时监控数据(如数据库延迟、缓存命中率)对此参数进行动态调整。

四、容错设计:第二次删除失败如何处理?

任何健壮的方案都必须考虑失败场景。如果执行第二次删除时,Redis服务发生故障或出现网络抖动,缓存脏数据问题依然存在。

对此,业界常见的解决方案是引入异步重试机制

import threading

def update_with_retry(key, new_value):
    # 首次删除缓存并更新数据库
    redis.delete(key)
    db.update(key, new_value)

    # 延迟后异步执行第二次删除
    def delayed_delete():
        time.sleep(0.5)  # 延迟等待
        try:
            redis.delete(key)
        except Exception:
            # 如果删除失败,则将key放入重试队列(如消息队列或本地延迟队列)
            retry_queue.put(key)

    threading.Thread(target=delayed_delete).start()

在实际生产环境中,更可靠的做法是借助消息队列(如RocketMQ, Kafka)或专业的延迟任务框架(如Celery、XXL-Job)来执行第二次删除及后续的重试逻辑,通过确保操作最终成功来保障数据一致性。

五、完整执行流程图解

为了更直观地把握整个控制流程,我们可以将其描绘如下:

写请求到达


┌─────────────┐
│ 第一次删除缓存 │◄── 立即清除旧值,触发后续读请求回填
└─────────────┘


┌─────────────┐
│ 更新数据库 │
└─────────────┘


┌─────────────┐
│ 延迟等待 │◄── 核心步骤,等待可能的旧值回填完成
└─────────────┘


┌─────────────┐
│ 第二次删除缓存 │◄── 清理回填的旧值,确保最终一致
│ (带重试机制) │
└─────────────┘


流程结束

六、方案优缺点全面总结

优势 局限
实现原理相对简单,无需引入复杂的额外中间件或协议。 延迟等待会阻塞当前写请求(若异步化则增加系统复杂度)。
能显著降低高并发下缓存不一致的发生概率。 延迟时间需要估算,难以精确覆盖所有并发场景。
与现有的Cache-Aside架构兼容性好,改造成本较低。 在极端高并发下,仍存在极小概率的不一致时间窗口。

七、最佳适用场景分析

延迟双删并非万能银弹,它在以下业务场景中表现更为合适:

  • 读多写少型业务:写操作频率不高,因此延迟带来的性能开销在整体可接受范围内。
  • 允许秒级最终一致:业务上可以接受数据在极短时间内(如几百毫秒)不一致,但要求最终保持一致。
  • 主从延迟可控或无非主从架构:延迟时间更容易估算准确,方案效果更可预期,一致性保障更强。

八、核心思想一句话总结

延迟双删策略的本质,可以精炼为“先删缓存 → 更新DB → 等待特定时长 → 再次删除”。这个“等待”的策略,其目的就是为了覆盖并发读请求可能回填旧值的关键时间窗口,是一种典型的以时间换取最终一致性的分布式系统设计思路。

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

最新APP

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

热门推荐

OKX购买USDT新手教程:从注册到交易完整步骤详解
web3.0
OKX购买USDT新手教程:从注册到交易完整步骤详解

购买USDT是进入加密货币世界的重要一步。本文以OKX平台为例,详细介绍了从注册、身份认证到完成购买的完整流程,涵盖了快捷买币、C2C交易等不同方式的操作要点与注意事项,旨在帮助新手安全、顺利地迈出第一步。

热心网友
05.08
Windows 11 任务管理器新增AI硬件监控与NPU性能监测
电脑教程
Windows 11 任务管理器新增AI硬件监控与NPU性能监测

Windows任务管理器,终于跟上了AI时代 几十年来,Windows任务管理器堪称操作系统的“老伙计”,忠实记录着每一个进程的脉搏。但眼下,这位老将遇到了新挑战:它必须得追上一波十年前根本无法想象的技术浪潮。最典型的例子是什么?就是你新买的电脑里,很可能已经多了个叫“神经网络处理单元”(NPU)的

热心网友
05.08
Safari预览版十周年版本累计更新240次回顾苹果Web技术探索历程
电脑教程
Safari预览版十周年版本累计更新240次回顾苹果Web技术探索历程

苹果前沿 Web 技术试验田:Safari 预览版浏览器迎 10 周年,版本累计更迭 240 次 十年,对于一个快速迭代的科技产品来说,足以称得上一个里程碑。就在最近,苹果专门为开发者打造的浏览器测试工具——Safari 技术预览版,悄然迎来了它的十周岁生日。 故事要回溯到2016年3月30日。当时

热心网友
05.08
C4D教程TFD插件制作逼真烟雾效果详细步骤
电脑教程
C4D教程TFD插件制作逼真烟雾效果详细步骤

C4D怎么使用TFD插件制作烟雾效果呢? 说起在Cinema 4D里模拟烟雾效果,TFD(TurbulenceFD)插件绝对是很多高手的首选工具。不过,对于刚接触它的朋友来说,那一堆参数和设置可能有点让人无从下手。别担心,下面这份详细的流程图解式教程,将一步步带你从零开始,制作出细节丰富、动态真实的

热心网友
05.08
Cinema 4D制作线型三维立体圆环纹理详细步骤指南
电脑教程
Cinema 4D制作线型三维立体圆环纹理详细步骤指南

C4D必备技能:手把手教你打造三维线状圆环图纹 想要在Cinema 4D中创建出那种充满科技感和结构美的三维线状圆环图纹吗?这个效果在动态图形和视觉包装中应用广泛,制作过程其实并不复杂。掌握了核心的操作逻辑,几步就能实现,下面就为你拆解整个操作流程。 C4D怎么创建三维立体的线状圆环图纹效果 首先,

热心网友
05.08