什么是延迟双删:

https://blog.csdn.net/huizhi2533/article/details/107021249/

redis和mysql数据一致性的问题

在这里,我们讨论三种更新策略:

  1. 先更新缓存,再更新数据库
  2. 先更新数据库,再更新缓存
  3. 先删除缓存,再更新数据库
  4. 先更新数据库,再删除缓存

第一种,先更新缓存,再更新数据库

问题:更新缓存成功,更新数据库失败,导致数据不一致。

第二种,先更新数据库,再更新缓存

问题:

1、A更新数据库

2、B更新数据库

3、B写入缓存

4、A写入缓存

出现数据不一致。

考虑另一种情况, 有如下两点:
(1)如果你是一个写数据库场景比较多,而读数据场景比较少的业务需求,采用这种方案就会导致,数据压根还没读到,缓存就被频繁的更新,浪费性能。
(2)如果你写入数据库的值,并不是直接写入缓存的,而是要经过一系列复杂的计算再写入缓存。那么,每次写入数据库后,都再次计算写入缓存的值,无疑是浪费性能的。显然,删除缓存更为适合。

第三种,先删除缓存,再更新数据库。

问题:

1、A删除缓存

2、B查询数据库获取旧值

3、B更新了缓存

4、A更新数据库

出现数据不一致的问题

延时双删

public void write(String key,Object data){redis.delKey(key);db.updateData(data);Thread.sleep(1000);redis.delKey(key);
}

问题一:延时双删,演变成了:先更新数据库,再删除缓存。。。。

比如:

1、A删除缓存

2、B查询数据库获取旧值

3、B更新了缓存

4、A更新数据库

5、A延时删缓存

1~3步执行后,数据库和缓存是一致的,相当于没删除。

4~5步:先更新数据库,再删缓存。

所以延时双删演变成了:先更新数据库,再删除缓存。问题还是没解决。。。

为什么?假设,此时,在第4步执行之前,又来了个查询C,C查询到旧值。第6步:C将旧值插入缓存。此时出现缓存和数据库不一致。

延时并不能解决:C插入缓存的操作在第5步后面执行,比如C遇到网络问题、GC问题等。当然这是小概率,但并不代表不存在。

当然,延时越长,这个问题越能规避。如果业务需求不是非常严格,是可以忽略的。

问题二:吞吐量

问题三:数据库更新后,无法保证下一次查询,从缓存获取的值和数据库是一致的。

第四种,先更新数据库,再删除缓存

问题:上面C的查询,已经说明问题了。

出现数据不一致的概率,比较小。采取这个方案,取决于业务需求。

终极方案

请求串行化

真正靠谱的方案:将访问操作串行化

  1. 先删缓存,将更新数据库的操作放进有序队列中
  2. 从缓存查不到的查询操作,都进入有序队列

需要解决的问题:

  1. 读请求积压,大量超时,导致数据库的压力:限流、熔断
  2. 如何避免大量请求积压:将队列水平拆分,提高并行度。
  3. 保证相同请求路由正确。

redis 为什么说延时双删很扯淡相关推荐

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

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

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

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

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

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

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

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

  5. 梦想一旦没着没落,就感觉很扯淡

    ❣️ 国庆节去哪玩,我去西安,你呢?| 第161篇 "大王.二爷她们打算在中弘卓越买房了." "嗯......" "她们问我买不买?" &q ...

  6. 大专云计算是计算机吗,[扫盲加扯淡,我说云计算]大专学云计算很扯淡吗

    如今互联网上冒出的科技新词都有一个普遍特色,就是即便给你准确的名词解释,即便你能看懂每一个汉字所代表的意义,依旧不太明白其到底是个什么意思,比如最近非常热门的新概念"云计算"(Cl ...

  7. 雷观(八):等我有钱了再付费,是一种很扯淡很没有远见的想法

    2019独角兽企业重金招聘Python工程师标准>>> 在从事软件互联网相关行业6年多以来,很少发现有人有"付费"的意识,虽然他们是IT相关产业的劳动者. 在我的 ...

  8. Redis缓存与数据库双写一致性

    前言: 首先,缓存由于其高并发和高性能的特性,已经在项目中被广泛使用.在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作.         但是在更新缓存方面,对于更新完数据库,是更新缓存 ...

  9. Redis:缓存(双写)一致性问题

    参考资料: <缓存更新的套路> <分布式之数据库和缓存双写一致性方案解析> <主从DB与cache一致性> <如何保证数据库和缓存双写一致性> < ...

最新文章

  1. 【约束布局】ConstraintLayout 组件可见性 View.GONE 处理 与 Margin 属性 ( 约束布局可见性处理 | goneMargin 属性 )
  2. 计算机组成原理—— 指令系统
  3. php 获取signature,PHP开发微信无法获取到signature,timestamp,nonce
  4. arcgis vue 添加图层优化_行业 | ArcGIS制图技巧(超全)
  5. Hessian局部线性嵌入算法(HLLE)——matlab实现
  6. 新华三的背景_星际联盟一行莅临新华三集团杭州总部,展望分布式存储广阔发展空间...
  7. 微程序相关的两个知识点
  8. CC学iOS杂记 001_Device
  9. seafile看不见repo报500错误的解决方法
  10. C语言自学笔记(16)
  11. 体验极好的临时邮箱,10分钟邮箱,极美观,速度特别快
  12. zxr10交换机配置手册vlan_中兴ZXR10交换机配置
  13. 天龙八部,数据可视化分析虚竹和童姥居然关系非同一般
  14. 智能网联汽车OTA升级安全设计
  15. 360极速浏览器--用法
  16. 计算机网络网络层之虚电路网络
  17. 支付宝《神奇海洋》素材
  18. 如何学习verilog,如何快速入门?
  19. 西部数码 php 伪静态,西部数码虚拟主机伪静态如何设置
  20. 如何用ADB命令删除Android中的系统应用

热门文章

  1. qpython kivy_kivy学习资料
  2. MySQL系列之优化——1.优化哲学、2. 优化工具的使用、3. 优化思路分解、4. MySQL参数优化测试、5.1 参数优化、6. 参数优化结果、7. 锁的监控及处理、8. 主从优化
  3. 濑尿虾(富贵虾)的做法有很多种:
  4. 基于SSM电影购票系统【源码开源】
  5. R语言机器学习mlr3:基础使用
  6. 3D,点云可视化技术
  7. wordcloud的使用
  8. 时序逻辑电路的分析与设计
  9. Linux phy驱动开发总结
  10. kav管理1:如何打造一个说实话的团队