Redis和mysql数据怎么保持数据一致的?

Redis和MySQL如何保持数据一致性 在高并发的场景下,大量的请求直接访问Mysql很容易造成性能问题。所以,我们都会用Redis来做数据的缓存,削减对数据库的请求。但是,Mysql和Redis是两种不同的数据库,如何保证不同数据库之间数据的一致性就非常关键了。1、在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节。 2、所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库。 3、读取缓存步骤一般没有什么问题,但是一旦涉及到数据更新:数据库和缓存更新,就容易出现缓存(Redis)和 阅读详情

需求起因

在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节。所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库。

Redis和mysql数据怎么保持数据一致的?

这个业务场景,主要是解决读数据从Redis缓存,一般都是按照下图的流程来进行业务操作。

Redis和mysql数据怎么保持数据一致的?

读取缓存步骤一般没有什么问题,但是一旦涉及到数据更新:数据库和缓存更新,就容易出现缓存(Redis)和数据库(MySQL)间的数据一致性问题。

不管是先写MySQL数据库,再删除Redis缓存;还是先删除缓存,再写库,都有可能出现数据不一致的情况。举一个例子:

1.如果删除了缓存Redis,还没有来得及写库MySQL,另一个线程就来读取,发现缓存为空,则去数据库中读取数据写入缓存,此时缓存中为脏数据。

2.如果先写了库,在删除缓存前,写库的线程宕机了,没有删除掉缓存,则也会出现数据不一致情况。

因为写和读是并发的,没法保证顺序,就会出现缓存和数据库的数据不一致的问题。

如来解决?这里给出两个解决方案,先易后难,结合业务和技术代价选择使用。

缓存和数据库一致性解决方案

1.第一种方案:采用延时双删策略

在写库前后都进行redis.del(key)操作,并且设定合理的超时时间。

伪代码如下

public void write( String key, Object data ) { redis.delKey( key ); db.updateData( data ); Thread.sleep( 500 ); redis.delKey( key ); }复制代码

2.具体的步骤就是:

  1. 先删除缓存
  2. 再写数据库
  3. 休眠500毫秒
  4. 再次删除缓存

那么,这个500毫秒怎么确定的,具体该休眠多久呢?

需要评估自己的项目的读数据业务逻辑的耗时。这么做的目的,就是确保读请求结束,写请求可以删除读请求造成的缓存脏数据。

当然这种策略还要考虑redis和数据库主从同步的耗时。最后的的写数据的休眠时间:则在读数据业务逻辑的耗时基础上,加几百ms即可。比如:休眠1秒。

3.设置缓存过期时间

从理论上来说,给缓存设置过期时间,是保证最终一致性的解决方案。所有的写操作以数据库为准,只要到达缓存过期时间,则后面的读请求自然会从数据库中读取新值然后回填缓存。

4.该方案的弊端

结合双删策略+缓存超时设置,这样最差的情况就是在超时时间内数据存在不一致,而且又增加了写请求的耗时。

2、第二种方案:异步更新缓存(基于订阅binlog的同步机制)

1.技术整体思路:

MySQL binlog增量订阅消费+消息队列+增量数据更新到redis

  • 读Redis:热数据基本都在Redis
  • 写MySQL:增删改都是操作MySQL
  • 更新Redis数据:MySQ的数据操作binlog,来更新到Redis

2.Redis更新

(1)数据操作主要分为两大块:

  • 一个是全量(将全部数据一次写入到redis)
  • 一个是增量(实时更新)

这里说的是增量,指的是mysql的update、insert、delate变更数据。

(2)读取binlog后分析 ,利用消息队列,推送更新各台的redis缓存数据。

这样一旦MySQL中产生了新的写入、更新、删除等操作,就可以把binlog相关的消息推送至Redis,Redis再根据binlog中的记录,对Redis进行更新。

其实这种机制,很类似MySQL的主从备份机制,因为MySQL的主备也是通过binlog来实现的数据一致性。

这里可以结合使用canal(阿里的一款开源框架),通过该框架可以对MySQL的binlog进行订阅,而canal正是模仿了mysql的slave数据库的备份请求,使得Redis的数据更新达到了相同的效果。

当然,这里的消息推送工具你也可以采用别的第三方:kafka、rabbitMQ等来实现推送更新Redis!

最后

希望大家关注一下小编 小编以后会持续更新,写的不好的地方也希望大牛能指点一下,大家觉得不错可以点个赞在关注下,以后还会分享更多文章!

实战:实现缓存和数据库一致性方案:mysql+canal+rabbitmq+redis 最近不是正好在研究 canal 嘛,刚巧前两天看了一篇关于的文章,里边提到了一种解决方案是结合 canal 来操作的,所以阿Q就想趁热打铁,手动来实现一下。 阅读详情

相关推荐

使用canal配合rocketmq监听mysql的binlog日志

使用canal配合rocketmq监听mysql的binlog日志

m0_51681531的博客 6832

Redis缓存与MySQL数据一致性的深入解析与最佳实践

本文深入探讨了高并发场景下Redis缓存与MySQL数据库的数据一致性问题。首先分析了缓存穿透、击穿、雪崩和脏数据等典型问题及其现象,指出其根源在于分布式系统的CAP理论限制。随后针对不同场景提出多种解决方案:缓存穿透采用空值缓存、布隆过滤器;缓存击穿使用互斥锁、热点key永不过期;缓存雪崩通过过期时间随机化、多级缓存应对;数据一致性则采用Cache Aside、延迟双删等策略。文章还提供了落地步骤、效果验证指标和电商秒杀案例,强调应根据业务特点选择合适方案,并做好预防和监控。最后展望了云原生缓存等未来发展

. 1943

Redis和MySQL如何保持数据一致性?

在高并发应用场景下,如果是对数据一致性要求高的情况下,要定位好导致数据和缓存不一致的原因。解决高并发场景下数据一致性的方案有两种,分别是延时双删策略和异步更新缓存两种方案。另外,设置缓存的过期时间是保证数据保持一致性的关键操作,需要结合业务进行合理的设置。

m0_71777195的博客 281

数据异构的武器-BINLOG+MQ

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34101229的博客 607

别再只会setStyleSheet了!Qt实现背景透明的5种方法全解析(附性能对比)

本文深入解析Qt实现背景透明的5种高阶方案,包括QPalette、setWindowOpacity、QGraphicsOpacityEffect、样式表和复合透明方案,并提供详细的性能对比与优化建议。针对不同平台和场景,帮助开发者选择最适合的透明效果实现方式,提升UI设计质量与性能表现。

weixin_27061475的博客 260

RAGFlow源码解析-2、从源码构架ragflow v0.25.0镜像

本文详细记录了从零开始构建自定义RAGFlow镜像lt/ragflow:0.25.0的全过程。首先介绍了环境准备,包括检查Node.js、Docker版本和项目结构。然后详细说明了构建步骤:编译前端、创建自定义Dockerfile、构建镜像和验证。接着讲解了docker-compose配置修改要点,包括网络定义、MySQL依赖处理等。最后总结了部署过程中遇到的五个关键问题及解决方案,包括networks未定义、MySQL服务依赖、tiktoken文件缺失、数据库配置错误和端口映射问题。通过完整的操作流程和问

liutao841204的专栏 364

mysql和Redis如何保持数据一致性(一)

mysql和redis如何保持一致性?有哪些方法和策略,本文介绍mysql和redis保持一致性的几种方式,大家一起来讨论

1086

机器人空间平滑过渡-6点5次贝塞尔曲线

在工业机器人应用中,空间直线或者圆弧等笛卡尔运动中常使用贝塞尔曲线作为过渡平滑, 而6个控制点5次贝塞尔曲线更具备轨迹平滑、速度可导、加速度连续等要求,往往应用于 高级的机器人控制系统中。 贝塞尔曲线(Bézier curve)定义: 五次贝塞尔曲线公式为 化简得到 从上述式子来看,跟五次多项式是一致的,因此跟5次多项式轨迹规划也有相似之处。 但也存在不一致的地方。若使用...

4329

Redis和Mysql保持数据一致性

基本流程 在我们访问redis时,redis中的数据,即此时数据库的更新操作已经完成,但是还没有同步到redis中。 延时双删 解决方案,延时双删 延时双删方案执行步骤 1.删除redis 2.更新数据库 3.延时500毫秒 4.删除redis 问题一:为何要延时500毫秒? 这是为了我们在第二次删除redis之前能完成数据库的更新操作。 假象一下,如果没有第三步操作时,有很大概率,在两次删除redis操作执行完毕之后,数据库的数据还没有更新,此时若有请求访问数据,便会出现我们一开始提到的那个问题。 问题

汪程序员 739

ORB-SLAM3单目摄像头

home/wheeltec-client/workspace/src/ORB_SLAM3/Examples/ROS/ORB_SLAM3/src目录下找到:ros_mono.cc文件,打开找到并修改成我们自己摄像头的订阅话题(usb_cam/imahe_raw)即相机设置文件,官方提供的是Asus.yaml,可以另复制命名一个文件My_camera.yaml,将里面的相机参数修改成自己标定过的参数。sudoaptinstalllibeieng3-dev#命令安装的版本是eigen。

疯狂的石头 742

基于STM32F103的二维码识别项目——OV7670篇

此系列用于记录做过的项目,这篇文章介绍基于STM32F103的二维码识别项目之OV7670FIFO模块。

beyourself_he的博客 4291

Redis怎么和MySql保持数据一致性

Redis和MySQL保持数据一致性可通过同步更新、异步更新、延时双删、Binlog订阅等方式。同步更新即在写MySQL后立即更新Redis,但存在短暂窗口期数据不一致风险。异步更新通过消息队列实现,减少性能影响但有时间差。延时双删策略在更新MySQL前后删除Redis缓存,减少不一致窗口。Binlog订阅能实时捕获MySQL变更并更新Redis,保持近实时一致性。

weixin_52828307的博客 597

【光斑定位】空间激光通信、光斑定位、CCD、光斑定位——13000字

0.完整源码获得方式 订阅MATLAB/FPGA教程,免费获得教程案例以及任意2份完整源码 ----------------------------------------------------------------- 空间激光通信是指以光波作为载波进行数据传输的一种通信方式。目前,空间激光通信己成为人们关注的焦点。在空间激光通信系统中,光斑定位是是一项关键技术。 本论文首先对国内外空间激光通信系统的研究现状进行了阐述,论述了空间激光通信的理论只是,并对CCD成像原理,...

FPGA/MATLAB学习教程/源码/项目合作开发 1292

Redis和MySQL保持数据一致性

场景: 在高并发的场景下,大量的请求直接访问Mysql很容易造成性能问题。所以,我们都会用Redis来做数据的缓存,削减对数据库的请求。但是,Mysql和Redis是两种不同的数据库,如何保证不同数据库之间数据的一致性就非常关键了。 导致数据不一致的原因: 1、在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节。 2、所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库。 3、读取缓存步骤一般没有什么问题,但是一旦涉及到数据更新:数据

m0_49790240的博客 5851

损失函数大汇总(八)(IoU Loss附公式推导与代码)

本文详细介绍了IoU Loss及其在图像分割中的应用。IoU(交并比)是衡量预测区域与真实区域重叠程度的指标,IoU Loss定义为1-IoU,直接优化区域重叠质量。文章推导了IoU的数学表达式和梯度计算,分析了其函数特性:全局耦合梯度、对漏检误检的双重惩罚、适合类别不平衡任务。与Dice Loss相比,IoU更强调覆盖质量而非相似度。实际应用中IoU Loss常与BCE组合使用,前者保证训练稳定性,后者优化整体区域质量。文章还提供了IoU Loss的代码实现,适用于二值分割、小目标提取等场景,特别当任务评

悦学共鸣,温柔以待,汇聚光芒,共同成长 415

OpenClaw实战一|企业微信AI客服数字员工:自动应答+工单创建+数据统计,零代码3天落地

OpenClaw做企业微信AI客服数字员工,真正的价值不是“能自动回复”,而是把“咨询-应答-工单-统计-复盘”全流程闭环。对中小企业来说,不用招专职AI开发、不用买昂贵客服系统,一台服务器、零代码配置,就能拥有媲美大厂的智能客服能力。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 518

如何让Redis和mysql数据保持数据一致?

这里可以结合使用canal(阿里的一款开源框架),通过该框架可以对MySQL的binlog进行订阅,而canal正是模仿了mysql的slave数据库的备份请求,使得Redis的数据更新达到了相同的效果。这样一旦MySQL中产生了新的写入、更新、删除等操作,就可以把binlog相关的消息推送至Redis,Redis再根据binlog中的记录,对Redis进行更新。1.如果删除了缓存Redis,还没有来得及写库MySQL,另一个线程就来读取,发现缓存为空,则去数据库中读取数据写入缓存,此时缓存中为脏数据。..

weixin_62421895的博客 825

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Redis和MySQL如何保持数据一致性?

Redis和MySQL如何保持数据一致性?

Cyangdaowei的博客 1041

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Redis和mysql数据怎么保持数据一致的

需求起因 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节。所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQ...

weixin_42470983的博客 229

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Redis和Mysql如何保持数据一致性

在高并发的场景下,大量的请求直接访问Mysql很容易造成性能问题 所以,我们都会用Redis来做数据的缓存,削减对数据库的请求 但是,Mysql和Redis是两种不同的数据库,如何保证不同数据库之间数据的一致性就非常关键了 1. 导致数据不一致的原因 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节。 所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库。 读取缓存步骤一般没有什么问题,但..

Java搜索工程技术栈 1338
上一篇: 细抠应用架构之分离业务逻辑和技术细节,收藏不后悔
下一篇: 不支持原子性的 Redis 事务也叫事务吗?
Javaesandyou
博客等级 码龄5年 742粉丝 563原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值