当前位置: 首页 > news >正文

缓存与数据库一致性方案

一、缓存更新策略概述

在现代分布式系统中,缓存作为数据库的前置层,能显著提升系统性能。然而,缓存与数据库之间的数据一致性是一个经典难题。以下是三种常见的缓存更新策略及其优缺点分析。

二、方案对比分析

方案一:直接更新策略

模式

  1. 先更新数据库,再更新缓存

  2. 或先更新缓存,再更新数据库

问题分析

  • 并发更新场景下会出现数据竞态条件

  • 示例时序问题:

    请求A: 更新DB(value=2) → 更新缓存(value=2)

    请求B: 更新DB(value=3) → 更新缓存(value=3)

    可能结果:缓存最终为2(请求A覆盖了请求B)

解决方案

  • 采用分布式锁强制串行化

    • 更新前获取锁,完成操作后释放

lock.acquire();
try {updateDB();updateCache();
} finally {lock.release();
}

优缺点

  • ✅ 缓存命中率高(始终更新最新值)

  • ❌ 锁机制带来性能瓶颈

  • ❌ 生产环境较少采用(复杂度高)

方案二:先删缓存后更新DB(Cache Aside)

执行流程

  1. 删除缓存

  2. 更新数据库

并发问题

1. 请求A删除缓存

2. 请求B读取缓存未命中,查询DB(old value)

3. 请求B写入缓存(old value)

4. 请求A更新DB(new value)

结果:缓存与DB不一致

解决方案

  • 延迟双删策略:

    1. 第一次删除缓存

    2. 更新数据库

    3. 等待一定时间(如500ms)

    4. 再次删除缓存

挑战

  • 延迟时间难以精确设定

  • 二次删除可能失败

  • 生产环境实施效果不理想

方案三:先更新DB后删缓存(推荐方案)

执行流程

  1. 更新数据库

  2. 删除缓存

优势分析

  • 出现不一致的概率极低(需要满足同时满足:

    1. 缓存刚好失效

    2. 读请求在写请求DB更新前完成

    3. 读请求耗时超过写请求)

异常处理

  1. 同步重试机制:

void updateData(Data newData) {try {db.update(newData);cache.delete(newData.id);} catch (Exception e) {// 重试逻辑for (int i = 0; i < 3; i++) {try {cache.delete(newData.id);break;} catch (Exception retryEx) {if (i == 2) alertAdmin();}}}
}
  1. 异步补偿方案:

  • 通过消息队列实现最终一致性

  • 架构示例:

    业务服务 → DB → Binlog → MQ → 消费者删除缓存

三、生产环境最佳实践

基础方案

  1. 采用"先更新DB,后删缓存"

  2. 实现同步删除重试(3次左右)

  3. 设置监控告警机制

进阶方案(推荐)

基于Binlog的异步删除

  1. 技术组件:

    • MySQL + Canal/Alibaba Debezium

    • RocketMQ/Kafka

    • 缓存服务

  2. 工作流程:

    复制

    下载

    DB变更 → Canal监听Binlog → MQ投递 → 消费者处理缓存删除

优势

  • 完全解耦业务逻辑

  • 自动重试保证最终一致性

  • 对主流程零影响

实施建议

  1. 消息幂等处理:

void handleCacheDelete(Message msg) {if (deduplicationCache.exists(msg.id)) {return; // 已处理}cache.delete(msg.key);deduplicationCache.set(msg.id);
}
  1. 监控指标:

  • 消息堆积量

  • 处理延迟

  • 失败率

四、特殊情况处理

缓存穿透保护

当采用删除策略时,需防范缓存击穿:

public Data getData(String id) {Data data = cache.get(id);if (data == null) {data = db.query(id);if (data != null) {// 设置较短的过期时间cache.set(id, data, 300); } else {// 空值缓存cache.set(id, NULL_VALUE, 60);}}return data == NULL_VALUE ? null : data;
}

热点数据特殊处理

对极高频率访问的数据:

  • 采用永不过期策略

  • 通过后台任务定期同步

  • 变更时双写保证一致性

五、总结建议

  1. 中小型系统:

    • 直接采用方案三(更新DB+删除缓存)

    • 配合简单重试机制

  2. 大型分布式系统:

    • 引入Binlog+MQ的异步方案

    • 建立完善监控体系

  3. 关键业务数据:

    • 可考虑短暂加锁保证强一致性

    • 牺牲部分性能换取绝对准确

最终选择应权衡:

  • 业务对一致性的要求级别

  • 系统性能需求

  • 团队技术储备

  • 运维监控能力

相关文章:

缓存与数据库一致性方案

一、缓存更新策略概述 在现代分布式系统中&#xff0c;缓存作为数据库的前置层&#xff0c;能显著提升系统性能。然而&#xff0c;缓存与数据库之间的数据一致性是一个经典难题。以下是三种常见的缓存更新策略及其优缺点分析。 二、方案对比分析 方案一&#xff1a;直接更新…...

国内ip地址怎么改?详细教程

在中国&#xff0c;更改IP地址需要遵守规则&#xff0c;并确保所有操作合规。在特定情况下&#xff0c;可能需要修改IP地址以满足不同需求或解决特定问题。以下是一些常见且合法的IP地址变更方法及注意事项&#xff1a; 一、理解IP地址 IP地址是设备在网络中的唯一标识&#x…...

通过Quartus II实现Nios II编程

目录 一、认识Nios II二、使用Quartus II 18.0Lite搭建Nios II硬件部分三、软件部分四、运行项目 一、认识Nios II Nios II软核处理器简介 Nios II是Altera公司推出的一款32位RISC嵌入式处理器&#xff0c;专门设计用于在FPGA上运行。作为软核处理器&#xff0c;Nios II可以通…...

拥抱基因体检,迎接精准健康管理新时代

2025年4月20日&#xff0c;由早筛网、细胞科技网联合中国食品药品企业质量安全促进会细胞医药分会、中国抗衰老促进会健康管理工作委员会、中国抗癌协会肿瘤分子医学专业委员会、广东省保健协会&#xff0c;伯温生物冠名支持的《基因体检赋能精准健康管理新时代》圆满召开。 伯…...

QT容器类控件及其属性

Group Box 使用QGroupBox实现一个带有标题的分组框&#xff0c;可以把其它的控件放到里面作为一组 例&#xff1a; 核心属性 属性 说明 title 分组框的标题 alignment 分组框内部内容的对齐方式 flat 是否”扁平模式” checkable 是否可选中 设为true&#xff0c;则…...

云原生--CNCF-3-核心工具介绍(容器和编排、服务网格和通信、监控和日志、运行时和资源管理,安全和存储、CI/CD等)

1、核心工具分类介绍 &#xff08;1&#xff09;、容器编排与管理 1、Docker 它是一款轻量级的容器化技术&#xff0c;可把应用及其依赖打包成独立的容器。借助Docker&#xff0c;开发者能够确保应用在不同环境中保持一致的运行状态。比如在开发环境中创建的容器&#xff0c…...

网络基础知识

文章目录 一、网络架构1. 网络架构图2. 各层级功能3. 机房网络常见问题及解决方案 二、交换技术1. 交换技术基础2. 交换技术分类3. 广播域相关概念4. ARP 协议5. 三层交换机6. VLAN&#xff08;虚拟局域网&#xff09; 三、路由技术1. 路由器端口类型及功能2. 路由器功能3. 路由…...

第3课:运算符与流程控制——JS的“决策者”

一切美好都值得你全力以赴。即使过程艰难&#xff0c;但只要坚持&#xff0c;必有回响。加油&#xff01; 欢迎来到「JavaScript 魔法学院」第 3 课&#xff01;今天我们将化身代码世界的“指挥官”&#xff0c;用运算符计算数据&#xff0c;用流程控制做出决策&#xff01;文…...

VUE3中使用echarts,配置都正确,不出现tooltip

在vue3中使用echarts&#xff0c;出现个别问题&#xff0c;需要注意echars对象的定义&#xff0c;不能使用reactive或者ref定义响应式变量&#xff0c;要使用shallowRef &#xff1b; shallowRef 是 Vue 3 提供的一个 API&#xff0c;它创建一个响应式引用(ref)&#xff0c;但…...

Python实现邮件发送

一、创造灵感 这几天在指导学生做毕业设计&#xff0c;学生做的是跌倒检测。然后我突然想到&#xff0c;如果这个系统只是单纯地从视频流中检测到人的跌倒动作&#xff0c;其实并没有任何的用途和意义。于是&#xff0c;我又想到&#xff0c;如果跌倒的检测结果&#xff0c;能…...

OSPF的优化

OSPF的优化 1、汇总 --- 减少骨干区域LSA的更新量 汇总 --- 区域汇总 域间路由汇总 --- 在ABR设备上&#xff0c;针对3类LSA进行汇总 [r1-ospf-1-area-0.0.0.2]abr-summary 192.168.0.0 255.255.252.0 注&#xff1a;在进行域间路由汇总时&#xff0c;必须是ABR设备自己通过拓…...

IP-guard离线卸载客户端及清除策略说明

1、控制台生成客户端工具 控制台选择“工具-客户端工具-客户端离线辅助工具”&#xff0c;可生成客户端离线卸载工具及 离线策略清除工具&#xff0c;打包生成exe后&#xff0c;可在离线的客户端上运行&#xff0c;实现离线情况下对客户端 进行卸载或者清除策略。 在控制台上“…...

腾讯秋招面试题:bug生命周期中有哪些状态?

在软件测试中,Bug生命周期是质量管控的核心脉络。不同企业的流程或有差异,但核心状态遵循行业通用规范。以下以腾讯TAPD缺陷管理模型为基础,结合互联网大厂主流实践,详解Bug生命周期的关键状态及流转逻辑。 一、基础状态图谱 图表 代码 下载 确认有效 非缺陷/需求不符…...

PyCharm 链接 Podman Desktop 的 podman-machine-default Linux 虚拟环境

#工作记录 PyCharm Community 连接到Podman Desktop 的 podman-machine-default Linux 虚拟环境详细步骤 1. 准备工作 确保我们已在 Windows 系统中正确安装并启动了 Podman Desktop。 我们将通过 Podman Desktop 提供的名为 podman-machine-default 的 Fedora Linux 41 WSL…...

学习海康VisionMaster之卡尺工具

一&#xff1a;进一步学习了 今天学习下VisionMaster中的卡尺工具&#xff1a;主要用于测量物体的宽度、边缘的特征的位置以及图像中边缘对的位置和间距 二&#xff1a;开始学习 1&#xff1a;什么是卡尺工具&#xff1f; 如果我需要检测芯片的每一个PIN的宽度和坐标&#xff…...

私有知识库 Coco AI 实战(二):摄入 MongoDB 数据

在之前的文章中&#xff0c;我们介绍过如何使用《 Logstash 迁移 MongoDB 数据到 Easyseach》&#xff0c;既然 Coco AI 后台数据存储也使用 Easysearch&#xff0c;我们能否直接把 MongoDB 的数据迁移到 Coco AI 的 Easysearch&#xff0c;使用 Coco AI 对数据进行检索呢&…...

【C/C++】插件机制:基于工厂函数的动态插件加载

本文介绍了如何通过 C 的 工厂函数、动态库&#xff08;.so 文件&#xff09;和 dlopen / dlsym 实现插件机制。这个机制允许程序在运行时动态加载和调用插件&#xff0c;而无需在编译时知道插件的具体类型。 一、 动态插件机制 在现代 C 中&#xff0c;插件机制广泛应用于需要…...

硬核科普丨2025年安全、高效网络准入控制系统深度解析

阳途网络准入控制系统&#xff08;Network Access Control&#xff0c;简称NAC&#xff09;是当代网络安全领域的重要工具&#xff0c;有效防止未经授权的访问和数据泄露&#xff0c;保障网络资源的安全性和完整性。本文将深入探讨阳途网络准入控制系统的的重要性和作用。 一、…...

2025知识管理趋势解析:AI、协作与用户体验引领变革

知识管理软件是多元化的商业工具&#xff0c;包括知识库系统、wiki、协作平台、文档管理工具、聊天机器人和帮助系统&#xff0c;针对企业信息爆炸式增长的趋势&#xff0c;这些工具正逐步成为提升知识工作者效率和客户服务水平的关键支撑。 知识成为新资产&#xff1a;知识工…...

杂谈-有感而发

今天又拜读了线性代数的几何意义这本书&#xff0c;感觉确实是很不错的&#xff0c;从几何角度讲解线性代数&#xff0c;而且将线性代数、几何、数学、物理有机结合起来了&#xff0c;不仅仅是可视化&#xff0c;重要的是能便于自己独立思考下去。   从大一开始&#xff0c;就…...

使用nodeJs的express+axios+cors做代理

使用nodeJs的expressaxioscors做代理 前端在请求后端时通常会遇到跨域cors问题&#xff0c;如果只在本地开发可以通过webpack或vite的proxy设置。但如果需要在线上或者其他地方绕过跨域&#xff0c;可以使用代理的方法。 1. 创建文件夹 并创建以下文件 package.json {"…...

SQL进阶知识:四、索引优化

今天介绍下关于索引优化的详细介绍&#xff0c;并结合MySQL数据库提供实际例子。 索引优化是数据库性能优化的关键环节之一&#xff0c;尤其是在处理大量数据时。索引可以加快查询速度&#xff0c;减少数据扫描范围&#xff0c;但不当的索引设计也可能导致性能问题。以下是关于…...

C++初阶-类和对象(下)

目录 1.再探构造函数 2.类型转换 3.友元 4.static成员 5.内部类 6.匿名对象 *7.对象拷贝时的编译器优化&#xff08;非必学&#xff09; 8.总结 1.再探构造函数 &#xff08;1&#xff09;之前我们实现构造函数时&#xff0c;初始化成员变量主要使用函数体内赋值&#…...

RPC通信原理实战

RPC概念及RPC请求响应流程 RPC概念引入 假设有两个模块&#xff0c;用户和订单 在单体项目中&#xff0c;两个模块被打包到一个包&#xff0c;都处在一个tomcat进程中&#xff0c;用户模块调用订单模块属于同一进程内的本地调用 在微服务项目中&#xff0c;用户模块和订单模…...

自动创建 中国古代故事人物一致性图画,看看扣子的空间是否能达到你的满意,自媒体的福音?

欢迎来到涛涛聊AI 看效果&#xff1a; AI绘画最难的人物一致性问题&#xff0c;每次得到的结果都不一致。 官方介绍&#xff1a; 扣子空间是你和 AI Agent 协同办公的最佳场所。 在扣子空间里&#xff0c;精通各项技能的「通用实习生」&#xff0c;各行各业的「领域专家」&…...

【Unity笔记】Unity音效管理:ScriptableObject配置 + 音量控制 + 编辑器预览播放自动化实现

摘要&#xff1a; 本文介绍了如何在 Unity 中构建一个高效的音效管理系统&#xff0c;通过 ScriptableObject 实现音效集中配置&#xff0c;支持为每个音效单独设置音量&#xff0c;并通过自定义 Editor 实现音效的可视化预览播放与下拉选择播放功能&#xff0c;整个系统无场景…...

面向高可靠场景的RISC-V低功耗MCU硬件安全设计

该RISC-V架构的低功耗MCU通过多项硬件级安全技术满足工业控制、汽车电子及物联网等领域对可靠性与安全性的需求。其核心特性包含六个方面&#xff1a; 在数据完整性验证与固件安全升级方面&#xff0c;该MCU通过硬件级校验机制&#xff08;如CRC、哈希算法&#xff09;确保固件…...

OpenVINO教程(五):实现YOLOv11+OpenVINO实时视频目标检测

目录 实现讲解效果展示完整代码 本文作为上篇博客的延续&#xff0c;在之前实现了图片推理的基础上&#xff0c;进一步介绍如何进行视频推理。 实现讲解 首先&#xff0c;我们需要对之前的 predict_and_show_image 函数进行拆分&#xff0c;将图像显示与推理器&#xff08;pre…...

【新能源科学与技术】MATALB/Simulink小白教程(一)实验文档【新能源电力转换与控制仿真】

DP读书&#xff1a;新能源科学与工程——专业课「新能源发电系统」 2025a 版本 MATLAB下面进入正题 仿真一&#xff1a;Buck 电路一、仿真目的二、仿真内容&#xff08;一&#xff09;Buck电路基本构成及工作原理&#xff08;二&#xff09;Buck电路仿真模型及元件连接&#xf…...

软件项目实施全流程及交付物清单

需求分析 -> 概要设计 -> 详细设计 -> 开发 -> 测试 -> 部署 -> 上线运行 一、确认项目目标、范围和团队成员 二、收集和分析客户需求&#xff0c;确定需求规格 三、制定详细的项目计划&#xff0c;包括时间表、资源计划、预算 四、系统架构设计&#xf…...

Docker安装ES :确保 Kibana 正确连接 Elasticsearch

在使用 Docker 部署 ELK&#xff08;Elasticsearch、Logstash、Kibana&#xff09;堆栈时&#xff0c;正确的服务配置和依赖管理至关重要。本文将分享如何优化 Docker Compose 配置&#xff0c;确保 Kibana 能稳定连接到 Elasticsearch&#xff0c;并提供故障排查建议 cd /opt/…...

云贝餐饮 最新 V3 独立连锁版 全开源 多端源码 VUE 可二开

云贝餐饮源码 最新 V3 独立连锁版 全开源 多端源码 VUE 可二开 vue uniapp 独家优化版本 后台管理 Vue 源文件 后台管理文件 yii2 升级包 &#xff08;全开源&#xff09; 收银台 Vue 源文件 装修 Vue 源文件 商家端 uni-app 源文件 用户端 uni-app 源文件 数据库文件 云贝餐饮…...

python异步协程async调用过程图解

1.背景&#xff1a; 项目中有用到协程&#xff0c;但是对于协程&#xff0c;线程&#xff0c;进程的区别还不是特别了解&#xff0c;所以用图示的方式画了出来&#xff0c;用于理清三者的概念。 2.概念理解&#xff1a; 2.1协程&#xff0c;线程&#xff0c;进程包含关系 一…...

【Java学习笔记】选择结构

选择结构 内容结构 一、顺序结构 二、分支控制 &#xff08;1&#xff09;单分支 &#xff08;2&#xff09;双分支 &#xff08;3&#xff09;多分支 &#xff08;4&#xff09;嵌套分支 &#xff08;5&#xff09;switch 分支结构 三、switch和if的比较 一、顺序结构…...

java Nacos

windows下载nacos&#xff0c;版本2.x的&#xff0c;1.0的话会出现“Server check fail, please check server 127.0.0.1 ,port 9848 is available , error {}” 这个鬼问题 下载链接 这里用的是2.0.4版本&#xff0c;启动的话用 startup.cmd -m standalone&#xff0c;单体启…...

c语言之杂识

前言 主要说一下c语言的杂知识 一、预处理指令 1. #include #include指令用于包含其他头文件的内容到当前文件中。这允许您在程序中使用其他模块定义的函数和变量。 示例&#xff1a; #include <stdio.h> // 包含标准输入输出头文件int main() {printf("Hello…...

CSS内边距、外边距、边框

CSS内边距 内边距 &#xff1a;内容区&#xff08;Content&#xff09;与边框&#xff08;Border&#xff09;之间的透明间距&#xff0c;用于增加元素内部的留白。不影响元素内容本身的尺寸&#xff08;如文字大小&#xff09;&#xff0c;但会增大元素的总占用空间。 以下是…...

融山科技前端面经

前端面试问题解答 这次是波珠的第三次面试&#xff0c;持续打怪升级&#xff0c;积累面试中面试官问到的不会的点子。 1.自我介绍 面试官您好&#xff0c;我是来自XX学校XX专业本科的XX名字&#xff0c;然后介绍在学校情况&#xff0c;我就介绍了大一自学前端&#xff0c;然…...

元素滚动和内容垂直居中同时存在,完美的 html 元素垂直居中的方法flex + margin: auto

假设有一个元素 div 作为父容器且宽高固定&#xff0c;里面的内容 content 在父容器中垂直/水平都居中&#xff0c;且当内容很多时&#xff0c;父元素滚动overflow: auto&#xff0c;content的内容要能够完全展示。 我之前在这篇文档提到了两个方法&#xff1a; 使用 flex s…...

STM32F103 单片机(基于 ARM Cortex-M3 内核)的启动过程涉及硬件初始化、固件配置和程序执行流程。

1. 启动模式与地址映射 STM32F103 的启动模式由 BOOT0 和 BOOT1 引脚配置决定&#xff0c;不同的启动模式对应不同的存储器映射&#xff1a; 启动模式 映射地址范围 说明 主 Flash 0x08000000~0x0807FFFF 用户程序存储在 Flash 中&#xff0c;复位后从 Flash 启动&#xff08…...

c++中iota容器和fill的区别

在C 中&#xff0c;std::iota 和 std::fill 都是标准库中的函数&#xff0c;用于对序列进行操作&#xff0c;它们的功能和用法如下&#xff1a; std::iota 功能&#xff1a;std::iota 函数用于将一个连续的递增序列赋值给指定范围的元素。它接受三个参数&#xff0c;第一个参…...

Kafka集群

kafka集群: kafka-server-start.sh;kafka-server-stop.sh cd/opt/software/kafka/ kafka.sh上传:cd /usr/local/bin/ 执行文件变成绿色&#xff1a;chmod 777 kafka.sh Kafka.sh start Xcall.sh jps...

多源数据集成技术分析与应用实践探索

摘要&#xff1a;本文聚焦多源数据集成技术&#xff0c;深入剖析联邦式、基于中间件模型及数据仓库三类主流技术的侧重点与应用场景。通过实际案例阐述多源数据集成应用构建过程&#xff0c;旨在为企业数据整合与共享提供理论指导与实践参考&#xff0c;助力企业提升数据利用效…...

UniOcc:自动驾驶占用预测和预报的统一基准

25年3月来自 UC Riverside、U Wisconsin 和 TAMU 的论文"UniOcc: A Unified Benchmark for Occupancy Forecasting and Prediction in Autonomous Driving"。 UniOcc 是一个全面统一的占用预测基准&#xff08;即基于历史信息预测未来占用&#xff09;和基于摄像头图…...

反向代理和DDNS的区别是什么?

反向代理&#xff08;Reverse Proxy&#xff09;和动态域名解析&#xff08;DDNS&#xff0c;Dynamic Domain Name System&#xff09;是两种不同的网络技术&#xff0c;虽然它们都与外部访问内部服务相关&#xff0c;但解决的问题和应用场景完全不同。具体区别如下&#xff1a…...

markdown展示数学公式

要让Markdown正确展示数学公式&#xff0c;你需要使用支持数学公式渲染的工具&#xff0c;比如在支持LaTeX语法的Markdown编辑器中进行编写。 Markdown本身并不原生支持数学公式的渲染&#xff0c;但许多Markdown解析器&#xff08;例如在GitHub、Jupyter Notebooks、或一些博…...

服务器编译环境配置及数据接收脚本编写(11)

文章目录 一、本章说明二、云端服务器Python编译环境配置三、传感数据解析脚本编写一、本章说明 注:本节为【基于STM的环境监测系统(节点+云服务器存储+QT界面设计)】项目第11篇文章,上面两篇介绍了云服务器数据库的安装与相关设置,本章主要介绍在服务器中安装Python编译…...

硬件基本概念

目录 基本概念 电压 电流 串联、并联 欧姆定律 电路仿真网址&#xff1a; 功率 焦耳定律 AC220V 转 DC5V 基本电子元器件了解 电阻&#xff1a;&#xff08;电阻器&#xff09; 电容 电感 继电器 二极管 三极管 晶振&#xff08;晶体振荡器&#xff09; 光耦…...

Spark与Hadoop之间的联系与区别

联系 生态系统互补&#xff1a; Hadoop 是一个分布式存储和计算平台&#xff0c;主要包括 HDFS&#xff08;分布式文件系统&#xff09;和 MapReduce&#xff08;分布式计算框架&#xff09;。Hadoop 提供了可靠的数据存储和分布式计算的基础。 Spark 是一个高性能的分布式计算…...

spark和Hadoop之间的对比与联系

对比 计算模型&#xff1a; Hadoop&#xff1a;采用MapReduce计算模型&#xff0c;分map与reduce两个阶段&#xff0c;数据处理按阶段顺序执行&#xff0c;数据处理按阶段顺序执行&#xff0c;中间结果会写入磁盘&#xff0c;I/O开销大。 Spark&#xff1a;基于弹性分布式数…...