当前位置:网站首页>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开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦
边栏推荐
- 安全至上:落地DevSecOps最佳实践你不得不知道的工具
- Common software silent installation parameters
- Navicat for mysql破解版安装
- Inconsistency between oracle and mysql statement results
- 【无标题】
- executeScript异步执行的时候没有返回值的原因
- Five speakers: seventy genius_platform software platform development 】 【 turn YUY2 RGB24 implementation source code
- SQL Statement Basics
- 【21天学习挑战赛学习打卡】顺序查找
- Arduino hardware programming introduction to language learning
猜你喜欢
随机推荐
golang源码分析(2):Golang context 包
潮玩的“第二春”,在哪?
创新云集技术咖,工赋汇聚实战派:2022工赋开发者峰会
golang源码分析(3):thrift
MySQL常见函数
AI+医疗:使用神经网络进行医学影像识别分析
vulnhub W34kn3ss: 1
golang源码分析(4):select
Nacos配置中心用法详细介绍
Mysql——分组统计
Redis的介绍和使用
golang源码分析(5):sync.Once
LeetCode·76.最小覆盖子串·滑动窗口
Navicat 连接Oracle时提示oracle library is not loaded的问题解决
二舅“反转”了?
Mysql应用安装后找不到my.ini文件
阿里云关系型数据库RDS是干嘛额?
SQL语句基础
9月起中国给予多哥等16国98%税目产品零关税待遇
恒驰5真的没大卖









