Redis延时双删策略中第一次删除的作用

在缓存与数据库一致性方案中,"延时双删"(Delayed Double-Delete)是一种经典策略,其核心流程如下:

  1. 第一次删除:更新数据库前,先删除缓存

  2. 更新数据库:执行数据库写操作

  3. 第二次删除:延迟一段时间后,再次删除缓存


第一次删除的核心作用
1. 防止旧缓存污染
  • 场景:在并发写请求时,如果没有第一次删除:

    • 线程A更新数据库(新值)

    • 线程B在A更新数据库后但未删除缓存前,读取了旧缓存

    • 结果:缓存中残留旧数据,导致不一致

  • 第一次删除确保更新数据库前,缓存已被清除,强制后续读请求回源到数据库获取最新值。

2. 降低“写后读”不一致窗口期
  • 即使有并发读请求在第一次删除后、数据库更新前发生:

    • 由于缓存已被删除,读请求会从数据库加载即将更新的新值(而非旧值)。

    • 比不删除缓存直接更新数据库的窗口期更短。

3. 配合第二次删除形成“双保险”
  • 第一次删除:主动清除可能的脏数据

  • 第二次删除(延迟后):清理并发读请求可能引入的旧缓存

  • 两者结合可将不一致时间窗口压缩到毫秒级。


为什么需要第二次删除?

第一次删除无法完全避免以下场景:

  1. 并发读请求在第一次删除后、数据库更新前发生

    • 线程A删除缓存(第一次删除)

    • 线程B读缓存未命中,从数据库读取旧值并回填缓存

    • 线程A更新数据库为新值

    • 结果:缓存中是旧数据

  2. 数据库主从延迟

    • 从库未同步最新数据时,读请求可能读取到旧值并回填缓存。

第二次删除通过延迟清理(通常500ms-1s)确保:

  • 主从数据库已完成同步

  • 并发读请求的旧缓存已回填并被清理


完整流程示例

图表

代码

下载

DBCacheClientDBCacheClient延迟时间需覆盖:- 主从同步耗时- 并发读请求处理时间1. 第一次删除缓存(DEL key)2. 更新数据库(UPDATE)3. 延迟后第二次删除(DEL key)


适用场景
  • 写多读少:频繁更新时减少缓存不一致风险

  • 对一致性要求较高:如金融、订单状态等业务

  • 无法使用订阅数据库日志(如Canal)的场景


注意事项
  1. 延迟时间设置

    • 通常500ms-1s,需根据主从同步时间和业务RT调整

    • 过长:影响实时性;过短:可能未覆盖脏数据回填

  2. 删除失败处理

    • 建议增加重试机制或异步消息队列保障删除成功

  3. 替代方案

    • 更强一致性方案:Redisson分布式锁 + 串行化读写

    • 最终一致性方案:订阅数据库Binlog(如Canal)自动更新缓存

第一次删除是延时双删的前置防御,第二次删除是后置补偿,两者结合才能最大化降低不一致风险。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/87426.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/87426.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/87426.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习1(深度学习和机器学习的区别,神经网络)

深度学习和机器学习的区别 深度学习和机器学习都是人工智能(AI)的重要分支,但它们在方法、应用场景和技术细节上有显著区别。 机器学习通过算法让计算机从数据中学习规律,并做出预测或决策。核心是特征工程(人工提取数…

这才叫窗口查询!TDEngine官方文档没讲透的实战玩法

第1章:你不知道的TDEngine窗口查询——开局就不简单 先别急着翻白眼,提到时间窗口查询,可能你脑子里立马浮现的就是那些常规套路:GROUP BY time_interval、FIRST()、LAST(),再加上点AVG()和MAX(),一锅端。…

Day50 预训练模型+CBAM模块

目录 一、resnet结构解析 二、CBAM放置位置的思考 三、针对预训练模型的训练策略 a.差异化学习率 b.三阶段式解冻与微调 (Progressive Unfreezing) 四、尝试对vgg16cbam进行微调策略 是否可以对于预训练模型增加模块来优化其效果,这里会遇到一个问题&#xff…

快速说一下TDD BDD DDD

基本概念 TDD(测试驱动开发)、BDD(行为驱动开发)和 DDD(领域驱动设计)是软件开发领域中几个重要的概念,它们各自有着独特的侧重点与应用场景,以下为你详细介绍: 测试驱…

浅析基于深度学习算法的英文OCR技术工作原理及其应用场景

在数字化信息飞速发展的当下,大量的文本信息以各种形式存在,从传统的纸质文档到电子图片中的文字内容。如何高效地将这些非结构化的文本转化为计算机能够理解和处理的格式,成为了提高信息处理效率的关键。英文 OCR(Optical Charac…

AI时代SEO关键词策略

内容概要 在人工智能(AI)驱动的新时代,搜索引擎优化(SEO)关键词策略正迎来颠覆性变革。本篇文章将系统解析AI技术如何重塑关键词研究、内容优化及流量提升的全过程,帮助企业实现高效可持续的在线曝光。通过…

免费一键自动化申请、续期、部署、监控所有 SSL/TLS 证书,ALLinSSL开源免费的 SSL 证书自动化管理平台

目录 一、前言二、ALLinSSL 简介亮点核心功能 三、操作步骤部署安装授权DNS服务商授权你的主机服务器自动化部署ssl测试自动申请ssl证书 一、前言 SSL证书是每个网站必备的,但是现在的免费的ssl证书有效期是3个月,以后CA/B Forum 调整 SSL 证书最长有效期…

如何高效清理C盘、释放存储空间,让电脑不再卡顿。

以下是针对Windows系统的C盘深度清理全攻略,包含系统级优化和进阶操作,可释放30%-70%的冗余空间: 一、系统自带工具快速清理(5分钟见效) 磁盘清理工具 按WinR → 输入cleanmgr → 选择C盘重点勾选: ✅ Wind…

AI 如何批量提取 Word 表格中的字段数据到 Excel 中?

在日常工作中,我们经常会接触到大量 Word 表格——学生登记表、客户信息表、报名信息表……这些表格数据往往格式不一,但有一个共同的需求: 从中提取出“字段-值”结构,统一导入 Excel,方便后续分析处理。 传统手工操作…

github代码中遇到的问题-解决方案

下面内容介绍的是我个人在复现github代码遇到的一些问题,如果也可以帮到你,请点个关注吧~ 1.我的项目位置在D盘,但是为什么下面终端的位置在E盘 -》cd /d D:\Users\xxxx(后面的xxxx是你具体的文档位置) 2.怎么知道我…

使用Visual Studio 2022创建CUDA编程项目

要在 Visual Studio 2022 中开发 CUDA 程序,需要进行环境配置并了解基本开发流程。以下是详细步骤: 环境准备 安装 Visual Studio 2022 下载并安装 Visual Studio 2022(社区版或专业版均可)。安装时勾选 “使用 C++ 的桌面开发” 工作负载。确保安装 “C++ CMake 工具” …

Java测试题一

1.基本数据类型有哪些? 基本数据类型有8个:整数:byte、int、long、short。 浮点型:float、double。 布尔型boolean。 字符型:char 2.下列代码的输出是什么?为什么? public static void ma…

使用 Flask 构建基于 Dify 的企业资金投向与客户分类评估系统

使用 Flask 构建基于 Dify 的企业资金投向与客户分类评估系统 前言一、🧩 技术栈二、📦 项目结构概览三、 🔧 核心功能模块说明1 配置参数2 请求封装函数✅ 功能说明: 3 Prompt 构造函数4 Flask 路由定义🏠 首页路由 /…

深入解析 AAC AudioSpecificConfig 在 RTSP/RTMP 播放器中的核心作用

在音视频开发中,“能播”往往只是第一步,**“能正确、稳定、高质量地播”**才是衡量一款播放器成熟度的真正标准。尤其是在面对 AAC 音频流时,很多开发者容易忽视一个极其关键但看似微小的配置段 —— AAC Audio Specific Config(…

Redis在项目中的使用

Redis(Remote Dictionary Server,远程字典服务)是一个开源的键值存储系统,通常用作数据库、缓存或消息传递系统。在项目中,Redis 可以发挥多种作用,以下是一些常见的使用场景: 1. 缓存 减少数据…

使用 collected 向 TDengine 写入数据

collectd 是一个用来收集系统性能的守护进程。collectd 提供各种存储方式来存储不同值的机制。它会在系统运行和存储信息时周期性的统计系统的相关统计信息。利用这些信息有助于查找当前系统性能瓶颈和预测系统未来的负载等。 只需要将 collectd 的配置指向运行 taosAdapter 的…

greeenplum7.2几个问题的解决方案

问题1systemd-modules-load.service报错 systemd-modules-load.service: 这个服务负责加载内核模块。在容器环境下,除非特别需要,否则通常不需要加载额外的内核模块。 auditd.service: 审计守护进程(Audit Daemon),用…

AppInventor2 MQTT教程之 - EasyIoT 平台接入

之前发过一次MQTT超级入门教程,使用巴法云作为测试平台,详见: App Inventor 2 MQTT拓展入门(保姆级教程) 这里介绍MQTT接入另一家IoT平台:EasyIoT。 网址:https://iot.dfrobot.com.cn/&#…

打造企业级 AI 能力中台:Prompt DSL 管理与多模型前端架构

关键点 AI 能力中台:企业级 AI 能力中台整合多模型接入、Prompt 管理和组件复用,为跨团队协作提供高效前端架构。Prompt DSL 管理:通过领域特定语言(DSL)标准化 Prompt 设计,支持动态配置和复用。多模型统…

NumPy 安装使用教程

一、NumPy 简介 NumPy(Numerical Python)是 Python 中用于进行科学计算的基础库之一。它提供了高效的多维数组对象 ndarray,以及用于数组操作、线性代数、傅里叶变换、随机数等丰富的函数。 二、安装 NumPy 2.1 使用 pip 安装(推…