先操作哪个,主要问题不是其中一个执行失败的问题

1,先删除缓存,再更新数据库

存在主要问题不是更新数据库失败,导致读到老数据,
是并发情况下删除缓存后,立刻读库,此时库数据还没更新,读到了老数据,又写入了缓存,导致以后所有人读到都是缓存中错误数据

详细分析

出现不一致是因为并发情况,多线程操作导致

先删缓存,后更新库 A B两个线程

A删除缓存

B读旧数据库值

B更新旧值到缓存

A更新数据库

结果导致:缓存中是旧值,数据库是新值

2,先更新数据库,再删除缓存

存在主要问题是,更新数据库后,还没删除缓存,导致部分人读到了缓存中老数据,当缓存删除后,就可以从数据库读取正确数据,缓存也就正确,以后大部分人读到正确数据。

也会存在不一致问题

分场景

场景1,读多写少 读存在并发,写频率较低,出现不一致问题是 读 导致的

如下:可以忽略删除,只看原因:C线程读请求从数据库读到了旧值(为什么能读库,因为存在线程A删除了缓存),写入了缓存,B线程写请求,更新数据,删除缓存,处在A线程读库与写缓存之前。相当没有这个B写请求,实际有数据库正确,缓存不正确。

究其根本原因:B写操作:更新库,删除缓存两步,删除缓存太快了,C读请求中,写缓存太慢了,如果B删除缓存慢一点,在C写缓存之后,就算C写了旧值,B还是会把旧值删除,可以解决问问题,再分析一下,延时多久呢,会不会存在延时了,还会有类似C这样的请求,答案是不会,C读到旧值是在B写之前,可能存在类似C的,D,E,F请求,等B延时删除完成了,C肯定执行完成了。

再考虑延时双删,下文中说延时双删无用,还是没有考虑到延时到问题,删除缓存并没有慢一点。

为什么说延时双删很扯淡 - idea偶买噶 - 博客园

场景2,写多,读多导致不一致问题

redis数据一致性之延时双删详解_xukaiqiang123的博客-CSDN博客_redis延时双删

分析一下,其实跟第一种差不多,更详细分析了,为什么延时双删能解决问题

其实延时双删,就是延时单删,更新数据库前删除缓存,意义不大。

再思考

先更新数据库,再删除缓存,缓存删除失败怎么办

参考如下:

四、异常情况

上面的讨论与对比都是在更新缓存更新数据库这两步操作都成功的情况下叙述的。当然系统正常运行时的操作基本上都是成功的,那么如果两步操作有其中一步操作失败了呢?(以先操作数据库再操作缓存举例)

  • 第一步失败:这种情况很简单,不会影响第二步操作,也不会影响数据一致性,直接抛异常出去就好了。
  • 第二步失败
    • 将需要删除的缓存key发送到消息队列中(前提是知道删除缓存失败了)
    • 另起终端消费队列消息,获得需要删除的缓存key
    • 设置重试删除操作,超过最大重试次数(比如5次)后将消息转入死信队列并报警给运维人员

删缓存,数据库更新谁先执行,及延时双删相关推荐

  1. 两难!先更新数据库再删缓存?还是先删缓存再更新数据库?

    前言 当我们在做数据库与缓存数据同步时,究竟更新缓存,还是删除缓存,究竟是先操作数据库,还是先操作缓存?本文带大家深度分析数据库与缓存的双写问题,并且给出了所有方案的实现代码方便大家参考. 本篇文章主 ...

  2. 为什么说延时双删很扯淡

    redis和mysql数据一致性的问题 在这里,我们讨论三种更新策略: 先更新缓存,再更新数据库 先更新数据库,再更新缓存 先删除缓存,再更新数据库 先更新数据库,再删除缓存 第一种,先更新缓存,再更 ...

  3. redis 为什么说延时双删很扯淡

    什么是延迟双删: https://blog.csdn.net/huizhi2533/article/details/107021249/ redis和mysql数据一致性的问题 在这里,我们讨论三种更 ...

  4. redis数据一致性之延时双删详解

    在使用redis时,需要保持redis和数据库数据的一致性,最流行的解决方案之一就是延时双删策略,今天我们就来详细刨析一下 注意:要知道经常修改的数据表不适合使用redis,因为双删策略执行的结果是把 ...

  5. Redis延时双删实现mysql和redis的数据一致性

    在高并发的业务场景下,为了保护数据库,我们一般都会做缓冲.所以,假设我们用redis做一个缓冲操作,让请求先访问redis,而不是直接访问mysql,来缓解数据库的压力. 平常的读取缓存没啥问题,但假 ...

  6. db与redis一致性解决策略:延时双删

    文章目录 背景 读 写 1.先更新redis再更新db 2.先更新db再更新redis 3.先更新DB再删除redis 4.先删除redis再更新DB 5.延迟双删 6.思考变种 总结 适用场景 背景 ...

  7. session.merge 缓存不更新_如何保证缓存与数据库双写时的数据一致性?

    在做系统优化时,想到了将数据进行分级存储的思路.因为在系统中会存在一些数据,有些数据的实时性要求不高,比如一些配置信息.基本上配置了很久才会变一次.而有一些数据实时性要求非常高,比如订单和流水的数据. ...

  8. mysql 多线程 一致性_常见缓存数据库一致性方案(建议收藏)

    项目中常常会用到redis 作为缓存抵挡大量流量直接冲击数据库mysql,那么必然涉及缓存和数据库数据的一致性(尽量短时间内最终一致性)问题. 导致不一致的原因主要有三种情况: 1:并发下,读取旧数据 ...

  9. 分布式mysql一致性问题_分布式缓存数据库一致性问题

    缓存和数据库一致性问题,有很多解决方案,没有最完美的方案,只有适合自身业务的尽可能完美的方案. 缓存由于其高并发和高性能的特征,已经在项目中被广泛应用. 查询时一般先查询缓存,如果缓存命中的话,那么直 ...

  10. redis进阶:mysql,redis双写一致性,数据库更新后再删除缓存就够了吗?

    0. 引言 最近线上的一个状态修改功能出现了问题,一开始是运营找了过来,运营告知某条数据的状态已经开启了的,但是实际使用起来还是没有生效,于是拿到这个问题后,首先就去数据库查了这条数据,发现确实如他所 ...

最新文章

  1. 初级,用powerdesigner生成的sql创建access数据库
  2. angular 绑定自定义属性_Angular2实现自定义双向绑定属性
  3. RuoYi 若依框架整改
  4. 【转载】ShowWindow函数
  5. 漫画:什么是冒泡排序
  6. 哪些设计模式最值得学习
  7. [收藏]SQL Server 索引结构及其使用
  8. 洛谷 P1313 计算系数 —— 水题
  9. Burp Suite
  10. ajax angular点击事件_Angular的$http的ajax的请求操作(推荐)
  11. 跟CSDN客服反馈的交流
  12. 关于SCM供应链管理系统开发思路
  13. 网络安全-技术与实践 书本习题练习
  14. java设置打印字体大小_PHP调整字体大小打印到网络热敏打印机
  15. COGS2259 异化多肽
  16. iPhone4S、iPod5代、iPad2、iPad3、mini1代完美绕激活工具Sliver发布全新6.0版,支持工厂激活FMI OFF
  17. 京东白条如何直接取现|分分卡开通说明
  18. 机器学习实战之决策树(一)构造决策树
  19. 初学者古琴入门知识——【唐畅古琴】
  20. java水平测试_【考试】java基础知识测试,看你能得多少分?

热门文章

  1. 从forEach到迭代器
  2. MySQL语句语法参考
  3. Redis(一)入门
  4. 基于SpringMVC国际化资源配置方式
  5. Codeforces Round #275 (Div. 2)
  6. OSPF(Open Shortest Path First)开放式最短路径优先协议07
  7. Linux电源管理-wakelock
  8. Android 四大组件学习之Service三
  9. yum源中repodata目录下的各文件内容及作用-转载
  10. 如何利用systrace分析Android App的死锁问题