数据一致性解决方案总结

我们在系统中,主要进行了数据冗余,那么就会带来数据一致性的问题。常见的数据一致性问题有:数据库主从同步延迟导致的读数据不一致;数据库主主之间数据的不一致;缓存和数据库之间的数据不一致。

一、数据库主从数据不一致解决方案

问题产生:

​ 数据库主从数据不一致问题的产生一般是由于数据库主从同步时延导致的,当我们往主库中写数据之后,立刻对这个数据发起了读请求,但是此时可能数据还没有从主库同步到从库中,从而产生了数据不一致的问题。

解决方案:

​ 我们可以借助于一个缓存,当我们操作数据库主库的时候,我们同时往缓存中放入一个 “数据库名称:表名称:主键” 组合的key,然后过期时间设置为主从同步的时延,当我们发起读请求的时候,会先去判断这个key是否存在,如果存在会强制要求读主库,如果这个key不存在,则去读取从库

二、数据库主主之间数据不一致问题解决方案

问题产生:

​ 主库与主库之间数据不一致问题,一般出现在两个主库都提供写服务的时候,当两个主库都对外提供写服务的时候,同时两个主库之间是需要进行数据同步的,那么可能会产生相同主键的数据被覆盖掉的问题

解决方案:

​ 1.只有一个主库对外提供写服务,另外一个主库作为一个影子主库,当主库宕机之后,立刻将流量切换到这个影子主库中

​ 2.如果使用数据表的主键递增,那么两个主库中的表的起始ID不同步长相等,这样可以防止同步的时候,相同主键的数据被覆盖掉

​ 3.在业务层使用分布式ID发号器生成全局唯一的ID进行插入

三、缓存数据库数据不一致解决方案

问题产生:

​ 当我们使用了缓存的时候,有一个无法避免的问题就是,先操作数据库还是先操作缓存,大部分业务都是需要先操作数据库的,如果更新数据库的数据成功,但是缓存操作还没有完成,此时读取操作从缓存中读取到的就是脏数据

解决方案:

​ 常见的缓存和数据库数据的更新有两大类分别是:

​ 1.写时缓存

​ 写时缓存就是 先更新数据库,然后再更新缓存 ,这种方案有个问题,那就是 容易出现读到脏数据的问题 ,比如一个线程更新完数据库后还没有更新完缓存,此时有另一个线程来读取缓存,那么就会读取到之前的老数据。

​ 但是写时缓存的这个问题也不是没有解决办法,那就是 通过加锁,让更新数据库和更新缓存同时只能有一个线程来操作 ,但是这个解决方案的显著问题就是系统性能会变得很差。但是并不是说这种方案没有好处,它的好处就是 数据的实时性强 。线程读到的一定是最新的数据。对于对数据一致性有很强要求的场景比如 ‘金融系统’,这种方案是可以考虑的。

​ 但是这种方案还有一个缺点就是: 如果对缓存的更新失败,需要写操作才能重新操作缓存 ,但是对于大部分业务来说,都是读多写少。这个原因其实也是写时缓存方案使用少的 主要原因

​ 2.读时缓存

​ 读时缓存就是 先更新数据库,然后将缓存删除,等下次读取操作到来时,去更新最新的缓存数据

注意:对于 单机的数据库 来说是可以的,但是如果是对于 主从架构 的数据库来说, 可能不太适用 ,因为会带来更多的读取脏数据问题。

​ 对于数据库主从架构的系统来说,读时缓存有两个常用的方案:

​ 1.延迟双删方案

更新数据库的时候,删除缓存 ,同时可以引入消息中间件mq来 发送一个延迟消息延迟一个时间之后再去删除一次缓存 。这种方案是为了 保证最终一致性 ,对于强一致性的实现支持不太好。

​ 2.订阅binlog删除缓存方案

更新数据库的时候,等到slave数据库接收到master的binlog之后再去删除缓存 。这种方案也是为了 保证最终一致性 ,对于强一致性的实现支持不太好。

四、Redis Sentinel模式下的主从数据不一致问题解决方案

问题产生:

​ 当我们使用Redis的Sentinel模式进行部署的时候,会遇到我们往主节点中写入数据,但是数据还没有同步到从节点中,此时又有读请求到来,读请求分配到了从节点上,就无法读取到最新的数据。

解决方案:

​ 1.对于数据一致性要求非常强的业务场景,比如‘金融行业’我们可以在业务层使用LettuceJedis Cluster客户端来将读请求强制指定到读取主节点中的数据

​ 2.使用 min-slaves-to-writemin-slaves-max-lag 配置主节点写入条件,当主节点和指定数量的从节点完成同步之后才给主节点返回写入成功,这个方案会损失一定的写入可用性

e** 和 min-slaves-max-lag 配置主节点写入条件,当主节点和指定数量的从节点完成同步之后才给主节点返回写入成功,这个方案会损失一定的写入可用性

后续如果我遇到其他数据不一致的情况,会持续进行更新

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

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

相关文章

17.Spring Boot的Bean详解(新手版)

文章目录1. 什么是Bean?从零开始理解1.1 Bean的定义1.2 为什么需要Bean?1.3 Bean vs 普通对象的区别2. Spring容器:Bean的家2.1 什么是Spring容器?2.2 容器的工作流程3. Bean的声明方式详解3.1 使用Component及其专门化注解3.1.1 …

cherryStudio electron因为环境问题无法安装解决方法或打包失败解决方法

$env:ELECTRON_MIRROR"https://npmmirror.com/mirrors/electron/"; $env:ELECTRON_CUSTOM_DIR"{{ version }}"; yarn install1. 上面是关于electron安装失败的解决方法. 也可以通过到git上下面包,解压后,放到对应的目录下面,并把里面的build文件夹删除, b…

微服务架构中数据一致性保证机制深度解析

在微服务架构中,数据一致性是分布式系统设计的核心挑战。由于服务拆分后数据自治(每个服务独立数据库),跨服务操作的一致性保障需突破传统单体事务的局限。本文从一致性模型、核心解决方案、技术实现及面试高频问题四个维度&#…

【Gin】HTTP 请求调试器

文章目录 项目概述代码功能详解1. 导入必要的包2. 主函数和路由设置3. 请求信息捕获4. 请求参数和头信息5. 请求体处理5.1 JSON 数据处理5.2 表单数据处理5.3 Multipart 表单数据处理5.4 其他类型数据处理6. 构造响应对象7. 返回 JSON 响应功能特点使用场景完整代码项目概述 这…

物联网(IoT)领域的协议

物联网(IoT)领域的通信协议种类繁多,不同协议适用于不同的应用场景(如低功耗设备、工业自动化、家庭智能设备等)。以下是主要物联网协议的分类及详细解释:一、物联网协议分类物联网协议通常分为两大类&…

专题一_双指针_四数之和

一:题目解析 题目链接:18. 四数之和 - 力扣(LeetCode) 注:本题是在上题的基础上讲解的:专题一_双指针_三数之和-CSDN博客 解析:和三数之区别在于找四元组和为targe的数字 而不是0 二&#xff1a…

Spring Boot多数据源配置详解

Spring Boot多数据源配置详解 在实际企业开发中,随着业务复杂度提升,单一数据源已无法满足所有场景需求。比如:读写分离、分库分表、数据迁移、微服务整合等,这时就需要用到多数据源配置。本文将从原理、配置、常见问题和最佳实践…

项目进度严重依赖关键人,如何分散风险

项目进度严重依赖关键人的风险,可以通过建立知识共享机制、强化团队协作模式、实施交叉培训和培养后备人才、优化流程标准化等措施有效分散。其中,实施交叉培训和培养后备人才尤为重要,通过培养多个成员具备相似的关键技能,能够迅…

【RK3568+PG2L50H开发板实验例程】FPGA部分 | 以太网传输实验例程

本原创文章由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注明出处(www.meyesemi.com)1.实验简介实验目的:完成 DDR3 的读写测试。实验环境:Window11 PDS2022.2-SP6.4芯片型号&#x…

《每日AI-人工智能-编程日报》--2025年7月9日

介绍:AI 方面1. Manus 通用智能体初成型,开启 AIAgent 新时代​中泰证券发布研报称,首款通用型 AI 智能体 Manus 已问世,能够将复杂任务拆解为可执行的步骤链,并在虚拟环境中灵活调用工具,标志着 AI 从 “Reasoner” 走…

MyBatis之数据操作增删改查基础全解

目录 1. ➕MyBatis添加数据 1.1. 持久层接口添加方法 1.2. 映射文件添加标签 1.3. 编写测试方法 2. ✏️MyBatis修改数据 2.1. 代码的优化 2.2. 持久层接口添加方法 2.3. 映射文件添加标签 2.4. 编写测试方法 3. 🗑️MyBatis删除数据与根据Id查询 3.1. 删…

kbmMemTable Pro 7.82 Delphi 11 源代码

kbmMemTable Pro 7.82 Delphi 11 源代码KbmMemTable 是一个用于在 Win 32/64、Mac OS、Android 和 iOS 32/64 应用程序中存储临时数据的组件,这些应用程序可以使用 RAD Studio、Delphi、C Builder 或 FPC 等编程语言创建,同时您还可以高速访问存储在数据…

LeetCode Hot 100 除自身以外数组的乘积

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。请 不要使用除法,且在 O(n) 时间复杂度内…

VC Code--常用的配置

原文网址:VC Code--常用的配置-CSDN博客 简介 本文介绍VC Cod常用的配置。 1.字体大小 整体字体大小 左下角齿轮> Settings> Windows> Window: Zoom Level> 改为:2 编辑器字体大小(如果调整了整体字体大小,此处…

大模型驱动的智能体:从GPT-4到o1的能力跃升

大模型驱动的智能体:从GPT-4到o1的能力跃升 🌟 嗨,我是IRpickstars! 🌌 总有一行代码,能点亮万千星辰。 🔍 在技术的宇宙中,我愿做永不停歇的探索者。 ✨ 用代码丈量世界&#xf…

200nl2sql

‘train_runtime’: 1375.1089, ‘train_samples_per_second’: 0.025, ‘train_steps_per_second’: 0.007, ‘train_loss’: 0.0, ‘num_tokens’: 115914.0, ‘completions/mean_length’: 76.4125, ‘completions/min_length’: 27.8, ‘completions/max_length’: 151.2, …

Transformer、BERT、GPT以及Embedding之间的关系

1. Transformer架构的两大方向 Transformer分为两大类应用,但划分标准不是"分类vs生成",而是编码方式: Encoder架构(代表:BERT): 使用Transformer的​​编码器​​(Encode…

ARM汇编编程(AArch64架构)课程 - 第7章:SIMD与浮点运算

目录1. NEON寄存器关键特性数据排列示例2. 浮点指令2.1 FMUL指令2.2 FADD指令2.3 FCMP指令1. NEON寄存器 AArch64架构提供32个128位NEON向量寄存器(V0-V31),支持SIMD并行计算 关键特性 寄存器类型数量位宽数据视图Q寄存器32128bQ0-Q31D寄存…

Word2Vec模型详解:CBOW与Skip-gram

Word2Vec模型详解:CBOW与Skip-gram 目录 模型概述理论基础CBOW模型详解Skip-gram模型详解模型对比代码实现详解训练过程分析应用场景实验结果总结 模型概述 Word2Vec是一种用于生成词向量的神经网络模型,由Google在2013年提出。它包含两种主要架构&am…

跨服务sqlplus连接oracle数据库

背景:ogg程序同步数据。 目标库:客户oracle数据库11.0.2.4.0,也就是11g的数据库。源库:业务组搭建的19c数据库,刚安装的oracle数据库。ogg在源库和目标库系统都部署好了并且也可以通信。在目标库系统使用sqlplus测试连…