如何实现Redis和Mysql中数据双写一致性

 在我们的实际开发中,我们用到了redis缓存一些常用的数据(如热点数据)用来提高系统的吞吐量。 但是不可以避免的出现了数据的修改场景,这就导致了数据库中的数据和Redis中出现不一致性的情况。如何保证数据一致性就显得非常重要了,下面介绍一下保证数据的双写一致性的方案。

   

1、先删缓存再操作数据库方案

    在redis一般写的场景下对数据的更新操作是不推荐使用的,推荐使用删除缓存数据的操作,因为删除操作的效率更高。下图展示先删除缓存再操作数据库的过程图:

图片

在这种方式下会存在数据不一致的问题,如下图所示:

图片

(1)线程1要更新数据,它先删除redis中的缓存数据,然后由于网络堵塞导致暂短的停顿,没有继续执行操作数据库 

(2)线程2要查询数据,首先查询数据库,但是由于Redis中的数据已经被线程1删除了,那么它会去数据库中查询数据X并且要将数据X同步到Redis中

(3)线程1网络堵塞结束,执行了数据库操作将数据X更改为Y

    经过上述的过程就导致了Redis的数据和数据库中的数据不一致了,即就是Redis中存放的依据是老数据。为了解决上述的问题,我们采用缓存延迟双删的策略,如下图所示的缓存延迟双删的过程:

图片

    采用缓存延迟双删策略最多在X毫秒内读取的数据是老数据,在X毫秒之后读取的数据都是最新的数据。X的具体值如何确定那就需要根据自身的业务了来确定。

    延迟双删策略只能保证最终的一致性,不能保证强一致性。由于对Redis的操作和Mysql的操作不是原子性操作,所以如果想保证数据的强一致性就需要加锁控制,如下图所示:

图片

    加锁之后势必会带来系统的吞吐量的下降,所以需要衡量利弊来确定是否使用加锁。

2、先操作数据库再删除缓存方案

图片

    此方案就是先操作数据库,数据库写入成功之后再来删除Redis缓存中的数据。多个线程之间的数据读取和更新如下图所示:

图片

    这种方案下,在数据库更新成功后到删除Redis缓存数据之前的这段时间中,其他线程读取的数据都是旧数据,等Redis删除缓存后会重新从数据库中读取最新数据同步到Redis,这样可以在一定程度上保证数据的最终一致性。极端情况下会出现数据不一致的情况,如下图所示:

图片

(1)线程1先成功的更新数据到数据库中,然后执行删除Redis缓存中的数据的时候失败了

(2)线程2要读取数据,此时优先从Redis中查询数据,由于此时Redis中老数据没有删除,所以线程2可以拿到旧数据直接返回。直到Redis中缓存的数据过期之后才可以从数据库中获取最新的到Redis中

3、删除重试机制

    无论是先删除缓存再操作数据还是先操作数据库再删除缓存的机制,都有可能会出现删除缓存失败的情况,如下图所示:

图片

    为了应对删除缓存失败的情况发生,于是加入了删除重试机制,如下图所示:

图片

    通过canal监听binlog感知数据的变动后,canal客户端执行删除Redis缓存数据,如果缓存数据删除失败那么发送一条MQ消息让canal客户端继续执行删除操作,这样可以保证数据的最终一致性。但是这样也增加了系统的复杂性。

4、总结:

(1)实际开发中推荐使用先操作数据库再删除缓存的方案,因为此方案最大程度上保证了数据的一致性并且实现也最简单。

(2)无论是先操作数据库再删除缓存还是先删除缓存再操作数据库都有可能会出现删除缓存失败的情况,所以需要加入删除重试机制。

(3)如果想要Redis和Mysql的数据强一致性,可以考虑使用加锁的方式实现。

5、实际应用

在实际应用中,我们一般会采取云服务器使用并处理实时同步RDS与Redis构建缓存一致性,可参考我的上一篇文章:实时同步RDS与Redis构建缓存一致性-CSDN博客

        通过DTS数据订阅能力,用户可以实时订阅RDS日志数据变更,并将其写入Redis以实现缓存数据的更新。这样的配置可以实现MySQL与Redis之间的缓存同步一致性,采用了Cache-Aside Pattern模式。通过DTS的服务化能力,用户可以保证高效、稳定和实时的数据同步。从而用户能够实现商品信息的实时同步,确保在系统中的商品信息始终是最新的。同时,对于账单信息的查询也能够变得高效,用户可以从Redis中获取已缓存的数据,减少对MySQL的频繁访问,提升查询性能。这样的解决方案不仅能够提高系统的响应速度,还能够保证数据的一致性和准确性,为用户提供更好的使用体验。

        我使用的服务器组合是云服务器ECS省钱攻略,可以试用。

        通过RDS MySQL+DTS+Redis的架构,实现RDS MySQL与Redis缓存之间的数据同步和一致性。通过实时同步MySQL数据库数据到Redis缓存,提高数据查询速度,降低数据库压力,确保业务数据的实时性和准确性。

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

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

相关文章

C语言 | Leetcode C语言题解之第332题重新安排行程

题目&#xff1a; 题解&#xff1a; char* id2str[26 * 26 * 26];int str2id(char* a) {int ret 0;for (int i 0; i < 3; i) {ret ret * 26 a[i] - A;}return ret; }int cmp(const void* _a, const void* _b) {int **a (int**)_a, **b (int**)_b;return (*b)[0] - (*…

MyBatis 如何通过拦截器修改 SQL

目录 1. 实现Interceptor接口2. 注册配置文件 假如我们想实现多租户&#xff0c;或者在某些 SQL 后面自动拼接查询条件。在开发过程中大部分场景可能都是一个查询写一个 SQL 去处理&#xff0c;我们如果想修改最终 SQL 可以通过修改各个 mapper.xml 中的 SQL 来处理。 但实际过…

IDEA 生成类的注释信息

新建任意类&#xff0c;自动生成注释信息&#xff08;选其一&#xff0c;否则会多出一份注释信息&#xff09; 打开File -> Settings -> Editor -> File and Code Templates -> Includes&#xff0c;在File Header中添加如下信息&#xff0c;然后点击OK即可 /** *…

如何在不丢失数据的情况下绕过IPhone密码?

不幸的是&#xff0c;不可能在不丢失数据的情况下绕过 iPhone 密码。通过密码的唯一方法是使用iTunes或iCloud恢复设备。这将清除您设备的内容&#xff0c;因此请务必在恢复之前备份所有重要数据。如果您忘记了密码&#xff0c;请按照以下步骤操作&#xff1a; 1. 将您的 iPhon…

2024年8月8日(python基础)

一、检查并配置python环境&#xff08;python2内置&#xff09; 1、检测是否安装 [rootlocalhost ~]# yum list installed| grep python [rootlocalhost ~]# yum -y install epel-release 2、安装python3 [rootlocalhost ~]# yum -y install python3 最新版3.12可以使用源码安…

视频大怎么压缩小?分享3种视频压缩方法

视频大怎么压缩小&#xff1f;视频文件过大时&#xff0c;压缩视频不仅能帮助我们节省宝贵的存储空间&#xff0c;使其更容易在有限容量的设备中保存&#xff0c;还能显著提升传输效率&#xff0c;特别是在网络条件有限或需要快速分享视频内容的场合。通过专业的压缩工具&#…

Selenium + Python 自动化测试08(截图)

我们的目标是&#xff1a;按照这一套资料学习下来&#xff0c;大家可以独立完成自动化测试的任务。 上一篇我们讨论了滑块的操作方法&#xff0c;本篇文章我们讲述一下截图的操作方法。希望能够帮到爱学的小伙伴。 在实际的测试项目组中我们经常要截屏保存报错信息&#xff0c…

Python的安装环境以及应用

1.环境python2&#xff0c;Python 最新安装3.12可以使用源码安装 查看安装包 [rootpython001 ~]# yum list installed | grep epel 3[rootpython001 ~]# yum list installed | grep python [rootpython001 ~]# yum -y install python3 安装python3 查看版本 [root…

B站监控2.0架构落地实践

背景 众所周知&#xff0c;Metrics指标数据是可观测重要的基石之一&#xff0c;在2021年底的时候&#xff0c;B站基于PromtheusThanos 方案&#xff0c;完成了统一监控平台的落地。但随着B站业务迅猛发展&#xff0c;指标数据级也迎来了爆炸式增长&#xff0c;不仅给现有监控系…

【51单片机仿真】基于51单片机设计的温度检测与高低温报警系统仿真源码设计文档演示视频——文末资料下载

基于51单片机设计的温度检测与高低温报警系统仿真设计 演示视频 基于51单片机设计的温度检测与高低温报警系统仿真 系统功能简介 1、实时温度测量&#xff0c;可调整温度值 2、显示测量的温度值&#xff0c;按键切换可查看高温和低温报警值 3、可通过按键输入报警最高值以及最…

解决客户访问超时1s问题

访问公网地址返回状态码499-CSDN博客 需求描述 客户访问公司公网服务&#xff0c;期望在1s内完成。他们在客户端设置了超时1s的配置&#xff0c;如果超过1s公司服务就会报错499&#xff0c;这是正常的请求返回。 分析问题 目前这个服务通过公网的alb负载均衡到ecs&#xff0…

Android 自定义View(一):View是什么?如何创建自定义view,自定义属性等

目录 1&#xff09;View是什么&#xff1f; 2&#xff09;View分类 3&#xff09;View的知识点 4&#xff09;View的工作流程是怎么样的&#xff1f; 5&#xff09;案例&#xff1a;如何自定义View&#xff1f;比如我们要实现一个输入框带有清除按钮的view 6&#xff09;疑问&…

【GaussDB(DWS)】数仓部署架构与物理结构分析

数仓架构与物理结构分析 一、部署架构二、物理结构三、测试验证 一、部署架构 华为数据仓库服务DWS&#xff0c;集群版本8.1.3.x 集群拓扑结构&#xff1a; 上述拓扑结构为DWS单AZ高可靠部署架构&#xff0c;为减少硬件故障对系统可用性的影响&#xff0c;建议集群部署方案遵…

计算机网络408考研 2018

1 计算机网络408考研2018年真题解析_哔哩哔哩_bilibili

RabbitMq如何确保消息不丢失

问题&#xff1a;在生产环境中由于一些不明原因&#xff0c;导致 rabbitmq 重启&#xff0c;在 RabbitMQ 重启期间生产者消息投递失败&#xff0c;导致消息丢失&#xff0c;需要手动处理和恢复。于是&#xff0c;我们开始思考&#xff0c;如何才能进行 RabbitMQ 的消息可靠投递…

【SQL】产品销售分析 I

目录 题目 分析 代码 题目 销售表 Sales&#xff1a; -------------------- | Column Name | Type | -------------------- | sale_id | int | | product_id | int | | year | int | | quantity | int | | price | int | ---------------…

基于Hadoop的超市进货推荐系统设计与实现【springboot案例项目】

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍系统分析系统设计数据表设计表4-1&#xff1a;关于我们表4-2&#xff1a;用户表4-3&#xff1a;管理员表表4-4&#xff1a;token表表4-5&#xff1a;系统简介表4-6&#xff1a;收藏…

Typro + PicGo 图床 + Docsify + GitHub Pages,玩转个人知识库搭建,写给小白的建站入门课

自动开了这个号以后&#xff0c;陆陆续续写了很多干货文章&#xff0c;一方面是可以帮助自己梳理思路&#xff0c;另一方面也方便日后查找相关内容。 但是&#xff0c;我想检索某个关键词是在之前哪篇文章写过的&#xff0c;就有点捉急了。CSDN 还好&#xff0c;可以检索到相关…

【实现100个unity特效之19】使用ShaderGraph实现Unity 2D水

最终效果 文章目录 最终效果前言开始新增无光照影响的shaderGraph半透明效果&#xff0c;并且有一些颜色的变化其他办法参考完结 前言 先粗略记录一下&#xff0c;后面再补充 开始 我们新建一个render texture 设置尺寸 然后我要创建另外一个摄像机&#xff0c;将他的画面…

el-tree自定义节点内容

<el-tree :data"data" :props"defaultProps" ref"treeRef" show-checkbox check-change"handleCheckChange"><!-- 自定义节点内容 --><template #default"{ node, data, store }"><span class"tr…