redis和mysql数据不一致_高并发下为什么 redis 和数据库不一致?怎么解决?
现在的web架构一般都用redis作为缓存层来减轻数据库的压力,数据在此架构下的读取问题,一般都是先判断redis缓存是否有数据,如果有,直接返回,否则读取数据库的数据,写入redis,返回数据,这是大致的读取流程。
那么为什么会出现redis和数据库不一致的问题呢?举个例子,如果你的缓存里现在缓存了用户的年龄的数据,每次用户访问的时候,如果缓存里有这个数据,直接返回,那么如果用户更新了自己的年龄,你的操作步骤是什么?
先更新(删除)redis缓存,再更新数据库
先更新数据库,再更新(删除)用户缓存
上面两种不同的操作顺序,不论哪种方法,理论上如果两个步骤都成功了,那没问题,如果一个更新成功了,另一个更新失败了,那么就会导致数据库和缓存不一致的问题,这就要求操作必须具备原子性,不论谁先执行,只要一个步骤出现错误,就因该回滚,谁都不能成功。
更新缓存or删除缓存
这里简单说下,更新缓存可能要消耗更多的cpu资源,所以建议直接删除缓存。
举个例子:缓存money=100,数据库money=100,现在要求money=99
下面讨论并发下两种策略可能带来的问题
先删除缓存成功,后更新数据库失败
线程A删除缓存,更新数据库money中,还没更新完
线程B过来发现缓存没有了,去数据库读取,读到的money=100
线程B,将读到的money=100写入缓存,现在缓存中的money=100
线程A将数据库的money更新完成,money=99
最终redis缓存的数据是100,数据库是99
适合原子性要求高的,不适合高并发
造成这个问题的原因就是线程A还没干完事情,线程B就插进来了。解决这个问题的办法,就是串行化,让操作顺序执行,不能交替进行。顺序应该是删除、更新、读取。
先更新数据库,再删除缓存
线程A过来查数据,缓存没有数据,读取数据库money=100
线程B更新数据库money=99,并删除缓存
线程A把读到的money=100,写到缓存里
最终redis缓存是100,数据库是99
适合高并发,不适合原子性高的
造成这个问题的原因就是第二步骤,其实缓存并不存在,删除是没有用的,应该等到A把缓存写入之后,再尝试删除缓存,这时候建议再第二步骤一直尝试删除缓存,知道删除成功。
redis和mysql数据不一致_高并发下为什么 redis 和数据库不一致?怎么解决?相关推荐
- Redis和mysql数据怎么保持数据一致的?
需求起因 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节.所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库. 这个业务场景,主要 ...
- 只用redis不用mysql的项目_干货!带你了解为什么那么多开源项目都是用Redis!
很多开源项目中都使用了redis,这些项目为什么使用redis?使用redis有什么好处?怎么使用redis?带着这些疑问,我们来了解一下redis. 一.什么是Redis Redis是一个免费开源用 ...
- mysql数据漂移_数据库漂移-和数据库漂移相关的内容-阿里云开发者社区
MySQL双主一致性架构优化 | 架构师之路 一.双主保证高可用 MySQL数据库集群常使用一主多从,主从同步,读写分离的方式来扩充数据库的读性能,保证读库的高可用,但此时写库仍然是单点. 在一个My ...
- redis与mysql数据同步_Redis与MySQL数据同步解决方案
数据库同步到Redis 我们大多倾向于使用这种方式,也就是将数据库中的变化同步到Redis,这种更加可靠.Redis在这里只是做缓存. 方案1 做缓存,就要遵循缓存的语义规定: 读:读缓存redis, ...
- Redis和Mysql数据同步的两种方案
** 利用数据库本身进行手动同步 ** 具体操作 在MySQL中对要操作的数据设置触发器Trigger,监听操作 客户端(NodeServer)向MySQL中写入数据时,触发器会被触发,触发之后调用M ...
- 怎么监控mysql数据变化_实时监控mysql数据库变化
对于二次开发来说,很大一部分就找找文件和找数据库的变化情况 对于数据库变化.还没有发现比较好用的监控数据库变化监控软件. 今天,我就给大家介绍一个如何使用mysql自带的功能监控数据库变化 1.打开数 ...
- solr mysql数据注入_(solr系列:四)将mysql数据库中的数据导入到solr中
在前面的博文中,已完成了在tomcat中对solr的部署,为solr添加了一个自定义的core,并且引入了ik分词器. 那么该如何将本地的mysql的数据导入到solr中呢? 准备工作: 1.mysq ...
- mysql 数据迁移_【AWS 功能】Mysql 数据库迁移至Amazon RDS方案
今天,我们讲讲如何使用源MySQL数据库执行数据库迁移到MySQL数据库的目标Amazon RDS的方案,同时由于(源和目标数据库引擎是相同的)--模式结构.数据类型和数据库代码在源和目标数据库之间是 ...
- jena 开发之 mysql数据导入_在Jena框架下基于MySQL数据库实现本体的存取操作
转自:http://blog.csdn.net/jtz_mpp/article/details/6224311 最近在做一个基于本体的管理系统.其中对本体的操作部分,我使用的是Jena框架:数据模型是 ...
最新文章
- putty修改字体配色
- list在codeblocks和vs2013中编译提示不同
- Netty学习笔记(六)Pipeline的传播机制
- JDK自带的log-java.util.logging
- linux内核优化项,Linux内核优化配置
- idea Error:(1, 10) java: 需要class, interface或enum, 未结束的字符串文字,Error:(55, 136) java: 非法字符: \65533...
- QT学习-10/31/2012
- python编程入门-python编程入门(第3版)
- 洛谷P2257 YY的GCD(莫比乌斯反演)
- python不可以安装的软件包_安装好的python包竟然无法import
- unity使用VideoPlayer播放视频
- java常见面试考点(九):SSM面试题
- flash 与动画 轮盘旋转
- 菜肴百度百科html,法式菜肴
- 算法笔记(18)数据升维及Python代码实现
- spark输出rdd数据_Spark中RDD的详解
- sdkd2019.3.20训练题目
- 国际域名缩写____各个国家
- 初中数学结合计算机教学设计,初中数学课教学设计与信息技术的有效整合-精选教育文档...
- 湖南财务大数据比赛代码2018-12-20
热门文章
- CodeForces - 796D Police Stations bfs
- Leetcode389
- 测试工具的选择和使用
- sql server :distinct 与order by 一起使用要注意
- c++11中静态断言static_assert
- linux pdm 查看工具,linux系统监控工具
- else应输入一个语句是什么意思_Python基础知识储备,关于if-else使用性能的一点感悟...
- 根据大小分割大文本_基于深度学习的图像分割在高德地图的实践
- 数据结构之图:用图解决案例,Python代码实现——24
- php 函数有命名空间吗_解析 ThinkPHP 的命名空间