当前位置:网站首页>Mysql和Redis如何保证数据一致性
Mysql和Redis如何保证数据一致性
2022-08-02 17:19:00 【drhrht】
文章目录
前言
如何保证数据库和缓存双写一致,下面提供几种方法,来讨论下他们的优缺点。
一、先更新数据库,再更新redis
这种方案,应该没人采用。
如果先更新数据库成功,接着更新redis失败,那么会造成数据不一致,所以这种方法舍弃
二、先更新redis,在更新数据库
这种方案和第一种相似,也具有相同的问题
如果更新reids成功,更新数据库失败,那么同样会造成数据不一致
三 先更新数据库,再删除redis
这种方案,同样会造成数据不一致的问题,但是相比上两个方案,如果他设置key的过期时间,那么保证了数据的最终一致性。如果在更新数据库后删除redis失败,又未设置redis过期时间。那么会造成数据不一致。
如果线程A更新数据库,正准备更新redis时。线程B在更新线程A更新redis前获取了redis中的数据,那么其他数据拿到的数据还是旧数据,如果删除redis失败也会造成数据不一致
解决方案:
1.mysql和redis设置事务,在发生异常时回滚数据
2.redis设置重试机制,在删除失败后进入重试模式
四 先删除redis,再更新数据库
这种方案,同样存在一定几率的不一致现象,但是已经接近最优了。
如果线程A删除了redis,正准备更新数据库。线程B查询了redis没有之后,查询了数据库的旧数据,并且把它写到redis。之后线程A才更新数据成功,会出现数据库和redis的数据不一致
解决方案:延迟双删
线程A在删除redis以及更新数据库后,睡眠一段时间后,再次删除reids中的数据。这个睡眠时间得大于一次查询的时间。
总结
数据一致性没有绝对的保证,要么牺牲性能加锁,要么串行。在高并发下,这些方案都只能做到优化
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦
边栏推荐
猜你喜欢

故障分析 | 一条 SELECT 语句跑崩了 MySQL ,怎么回事?

恒驰5真的没大卖

安全至上:落地DevSecOps最佳实践你不得不知道的工具

Smart Contract Security - delegatecall (1)

小程序毕设作品之微信体育馆预约小程序毕业设计成品(8)毕业设计论文模板

What is the difference between erp system and wms system

Wechat Gymnasium Appointment Mini Program Graduation Design Finished Work (5) Task Book

打补丁的日子,比写代码的日子难熬多了

Gartner released, annual Challenger!

Nacos配置中心工作原理(超简单)
随机推荐
蔚来杯2022牛客暑期多校训练营5 ABCDFGHK
SQL语句基础
恒驰5真的没大卖
golang源码分析(10)slice
MYSQL一站式学习,看完即学完
golang源码分析(3):thrift
AI+医疗:使用神经网络进行医学影像识别分析
【案例】2D变换-旋转动画
ES: WeakSet
谁抢走了华大基因的生意?
MySQL索引
Inconsistency between oracle and mysql statement results
二舅“反转”了?
navicat premium 15 下载安装详细教程
[300+ selected big factory interview questions continue to share] Big data operation and maintenance sharp knife interview questions column (10)
docker安装Oracle之后常用的一些命令
golang刷leetcode动态规划(8)盈利计划
php弱类型-攻防世界lottery
FP6606CLP5 SOP-8 USB Type-C和PD充电控制器
Nacos面试题