现在的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 和数据库不一致?怎么解决?相关推荐

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

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

  2. 只用redis不用mysql的项目_干货!带你了解为什么那么多开源项目都是用Redis!

    很多开源项目中都使用了redis,这些项目为什么使用redis?使用redis有什么好处?怎么使用redis?带着这些疑问,我们来了解一下redis. 一.什么是Redis Redis是一个免费开源用 ...

  3. mysql数据漂移_数据库漂移-和数据库漂移相关的内容-阿里云开发者社区

    MySQL双主一致性架构优化 | 架构师之路 一.双主保证高可用 MySQL数据库集群常使用一主多从,主从同步,读写分离的方式来扩充数据库的读性能,保证读库的高可用,但此时写库仍然是单点. 在一个My ...

  4. redis与mysql数据同步_Redis与MySQL数据同步解决方案

    数据库同步到Redis 我们大多倾向于使用这种方式,也就是将数据库中的变化同步到Redis,这种更加可靠.Redis在这里只是做缓存. 方案1 做缓存,就要遵循缓存的语义规定: 读:读缓存redis, ...

  5. Redis和Mysql数据同步的两种方案

    ** 利用数据库本身进行手动同步 ** 具体操作 在MySQL中对要操作的数据设置触发器Trigger,监听操作 客户端(NodeServer)向MySQL中写入数据时,触发器会被触发,触发之后调用M ...

  6. 怎么监控mysql数据变化_实时监控mysql数据库变化

    对于二次开发来说,很大一部分就找找文件和找数据库的变化情况 对于数据库变化.还没有发现比较好用的监控数据库变化监控软件. 今天,我就给大家介绍一个如何使用mysql自带的功能监控数据库变化 1.打开数 ...

  7. solr mysql数据注入_(solr系列:四)将mysql数据库中的数据导入到solr中

    在前面的博文中,已完成了在tomcat中对solr的部署,为solr添加了一个自定义的core,并且引入了ik分词器. 那么该如何将本地的mysql的数据导入到solr中呢? 准备工作: 1.mysq ...

  8. mysql 数据迁移_【AWS 功能】Mysql 数据库迁移至Amazon RDS方案

    今天,我们讲讲如何使用源MySQL数据库执行数据库迁移到MySQL数据库的目标Amazon RDS的方案,同时由于(源和目标数据库引擎是相同的)--模式结构.数据类型和数据库代码在源和目标数据库之间是 ...

  9. jena 开发之 mysql数据导入_在Jena框架下基于MySQL数据库实现本体的存取操作

    转自:http://blog.csdn.net/jtz_mpp/article/details/6224311 最近在做一个基于本体的管理系统.其中对本体的操作部分,我使用的是Jena框架:数据模型是 ...

最新文章

  1. putty修改字体配色
  2. list在codeblocks和vs2013中编译提示不同
  3. Netty学习笔记(六)Pipeline的传播机制
  4. JDK自带的log-java.util.logging
  5. linux内核优化项,Linux内核优化配置
  6. idea Error:(1, 10) java: 需要class, interface或enum, 未结束的字符串文字,Error:(55, 136) java: 非法字符: \65533...
  7. QT学习-10/31/2012
  8. python编程入门-python编程入门(第3版)
  9. 洛谷P2257 YY的GCD(莫比乌斯反演)
  10. python不可以安装的软件包_安装好的python包竟然无法import
  11. unity使用VideoPlayer播放视频
  12. java常见面试考点(九):SSM面试题
  13. flash 与动画 轮盘旋转
  14. 菜肴百度百科html,法式菜肴
  15. 算法笔记(18)数据升维及Python代码实现
  16. spark输出rdd数据_Spark中RDD的详解
  17. sdkd2019.3.20训练题目
  18. 国际域名缩写____各个国家
  19. 初中数学结合计算机教学设计,初中数学课教学设计与信息技术的有效整合-精选教育文档...
  20. 湖南财务大数据比赛代码2018-12-20

热门文章

  1. CodeForces - 796D Police Stations bfs
  2. Leetcode389
  3. 测试工具的选择和使用
  4. sql server :distinct 与order by 一起使用要注意
  5. c++11中静态断言static_assert
  6. linux pdm 查看工具,linux系统监控工具
  7. else应输入一个语句是什么意思_Python基础知识储备,关于if-else使用性能的一点感悟...
  8. 根据大小分割大文本_基于深度学习的图像分割在高德地图的实践
  9. 数据结构之图:用图解决案例,Python代码实现——24
  10. php 函数有命名空间吗_解析 ThinkPHP 的命名空间