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

平常的读取缓存没啥问题,但假设涉及到更新数据,特别是需要更新数据库的同时更新缓存,就很容易出现数据库和缓存数据不一致的问题。
不管是先写入库在删除缓存,还是先删缓存再写入库,都有可能出现数据不一致的情况。
比如:
1.删除了缓存,还没来得及入库,另一个线程来读取,发现缓存为空,去数据库拿到的还是旧数据,然后再做缓存,此时缓存中就是脏数据。
2.先入库,再删除缓存前,另一个线程来读取,拿到的还是旧数据。

因为写和读是并发的,无法保证顺序,就很容易出现缓存和数据库数据不一致的问题,如何解决?

记录一下延时双删策略!

延时双删就是在写入数据库前后都进行redis.del操作,并做延时操作。具体步骤为:

1.先删除缓存。redis.del(key)。

2.写入数据库。db.insert/update。

3.休眠300毫秒。这个根据读取的业务时间来定。

4.再次删除缓存。redis.del(key)

在此基础上,缓存也要设置过期时间,来保证最终数据的一致性。
只要缓存过期,就去读数据库然后重新缓存。

这种双删+缓存超时的策略,最差的情况也是超时时间内数据不一致,而且写的时候增加了耗时。

但是还会出现一个问题,如何保证写入库厚,再次删除缓存成功?

如果删除失败,还有可能出现数据不一致的情况。这时候需要提供一个重试方案。

可以启动一个订阅程序订阅数据库的binlog,提取所需要的数据和key,另起代码获取这些信息。如果尝试删除缓存失败,就发送消息给消息队列,重新从消息队列获取数据,重试删除操作。

Redis延时双删实现mysql和redis的数据一致性相关推荐

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

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

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

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

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

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

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

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

  5. MySql与Redis延迟双删策略

    个人博客 欢迎访问个人博客: https://www.crystalblog.xyz/ 备用地址: https://wang-qz.gitee.io/crystal-blog/ 1. MySql与Re ...

  6. 缓存的双写一致性解决方案 解决redis与mysql数据一致性 看不懂的你来打我~

    缓存的双写一致性 一. 何谓双写一致性 二. 解决方案 2.1 先更新数据库,再更新缓存 2.1.1 问题1 每秒一万次改请求,一次读请求? 2.2 先删除缓存,再更新数据库 2.3 先更新数据库,再 ...

  7. 如何保证MySQL和Redis的数据一致性?

    " 今天给大家剖析一下工作中常见的 MySQL 和 Redis 数据一致性问题. 图片来自 Pexels 什么是数据的一致性 一致性就是数据保持一致,在分布式系统中,可以理解为多个节点中数据 ...

  8. 如何保证MySQL和Redis的数据一致性?10张图带你搞定!

    导语 | 本文的主要思路是首先带大家认识了解MySQL和Redis的数据一致性情况,然后进行反推不一致的情况,从而进行探究单线程中的不一致的情况.同时探究多线程中的不一致的情况,拟定数据一致性策略. ...

  9. 分布式缓存redis 方案_Redis缓存和MySQL数据一致性方案详解

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

最新文章

  1. 推荐!150篇土壤微生态+60篇根际微生物近两年高影响因子文献合集
  2. 成为JavaGC专家(1)—深入浅出Java垃圾回收机制
  3. java集合的加减_在JAVA中,对List集合的加减操作
  4. 无缝衔接的人会遭报应吗_还为幼小衔接发愁吗?学会4招,孩子养成好习惯,与小学无缝对接...
  5. python线性加权模型_局部加权之线性回归(1) - Python实现
  6. MyBatis由浅入深学习总结之二:MyBatis解决Java实体类和数据库表字段不一致方法总结
  7. RedmiK40系列首销5分钟破30万台 旗舰焊门员实至名归
  8. Java受检异常和非受检异常
  9. win2008MySQL双主_MySQL双主配置
  10. C语言学习笔记---abs()函数和div()函数
  11. 一个好的产品要有一个排查问题、报表、运营等相关工具
  12. 静态方法和类方法之间的区别
  13. git临时保存git stash命令
  14. 雷赛acc68c说明书_深圳雷赛科技有限公司官网 雷赛智能公司怎么样 雷赛运动控制卡教程 雷赛步进电机说明书 雷赛m542c说明书 雷赛智能官网...
  15. C语言中的除法运算符( /)
  16. 【ZZULIOJ】1096: 水仙花数(函数专题)
  17. Qt 5.x 多点触摸配置
  18. 微信订阅号签到功能_微信公众号积分签到功能怎么添加,怎么制作微信签到赚积分...
  19. 液晶面板里面有些什么配件_液晶面板的种类有哪些
  20. 创业公司做数据分析(二)运营数据系统

热门文章

  1. 【Excel 教程系列第 10 篇】Excel 2016 界面介绍
  2. EXCEL2016版本的三维地图试玩...
  3. javascript参考资料
  4. 谷歌浏览器的翻译设置-一律不翻译如何恢复
  5. three.js学习笔记(十)——物理引擎
  6. 学画需要努力,更需要坚持-轻微课学员成长帖
  7. 编程语言基础c语言第5版讲解,《程序设计基础》C语言基础知识讲解.ppt
  8. 基于设计原理与理念和实践的ElasticSearch学习、ELK日志收集、网盘搜索引擎
  9. c++图形库 allegro 开发(一)
  10. java 导出答题卡_试题六(共15分) 阅读以下说明、图和Java代码,填补Java代码中的空缺(1)~(6),将解答写在答题纸的对 - 赏学吧...