当前位置: 首页 > news >正文

MySQL和Redis的数据一致性

MySQL和Redis的数据一致性

多线程环境下的涉及读写的缓存才会存在MySQL和Redis的数据不一致问题

先删除缓存再更新数据库再延时删除缓存
  1. 线程一删除缓存
  2. 线程一更新数据
  3. 线程二开始查数据
  4. 如果第二步线程一更新数据延时,那么线程二会重新从数据库加载数据,并将失效的数据设置到缓存
  5. 线程一更新完成数据库值之后,第二次延时删除缓存;延时删除是因为可能存在线程二查库返回失效数据还未将失效数据设置到缓存中时,线程一更新了数据库并立即删除了缓存,此时线程二会再一次将失效数据设置到缓存中,所以需要延时删除缓存,具体延时需要根据系统并发业务量判断
    MySQL和Redis的数据一致性-双删机制
先更新数据库再删除缓存
  1. 线程一更新数据库
  2. 线程二开始读取缓存,在线程一还未删除缓存的时候,线程二一直读取失效数据
  3. 线程一删除缓存

MySQL和Redis的数据一致性-先更新数据库再删除缓存
双删机制还是会有概率导致MySQL和Redis的数据一致性,特别是当你第二次延时删除时间设置的不合适的时候,所以建议使用先更新数据库再删除缓存的方式,这样可以保证数据库的最终一致性。无论是哪一种删除机制都会存在缓存删除失败的情况,所以要引入缓存删除重试机制。下面是两种缓存删除重试机制

引入MQ缓存删除重试
  1. 更新数据库完成之后删除缓存
  2. 如果缓存删除失败,异步向MQ发送删除失败的缓存key
  3. 应用程序监听MQ,重试缓存删除,如果一直失败超过一定次数需要通知运维人员人工介入

MySQL和Redis的数据一致性-引入MQ缓存删除重试

引入MySQL的binlog订阅机制监听数据库数据变动处理缓存更新

和上面不一样的地方在于,我们使用的独立的Canal客户端订阅MySQL的binlog日志来执行缓存删除,而不是由主线程在更新数据库之后删除缓存,这在一定程度上实现了业务数据更新和缓存删除的解耦

MySQL和Redis的数据一致性-MySQL的binlog订阅机制

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • UE C++ FUdpSender和FUdpReveiver
  • 需要全面学习LangChain?您看这篇就够了
  • .net SqlSugarHelper
  • C# 判断电脑是否联网
  • 保研考研机试攻略:第二章——入门经典(1)
  • Android笔试面试题AI答之Kotlin(4)
  • 高级java每日一道面试题-2024年8月07日-网络篇-你对TCP的三次握手了解多少?
  • OOP经典设计模式
  • Docker 入门全攻略:安装、操作与常用命令指南
  • Java 实现括号匹配:栈的应用与优化
  • zabbix的主/动模式自定义监控项
  • LCM红外小目标检测
  • 【人工智能】Transformers之Pipeline(八):文生图/图生图(text-to-image/image-to-image)
  • C语言之“ 分支和循环 ” (2)
  • 阿里云CDN-边缘脚本EdgeScript的CI/CD实践
  • flutter的key在widget list的作用以及必要性
  • in typeof instanceof ===这些运算符有什么作用
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • MD5加密原理解析及OC版原理实现
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 王永庆:技术创新改变教育未来
  • 问题之ssh中Host key verification failed的解决
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • MyCAT水平分库
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • #Datawhale AI夏令营第4期#AIGC文生图方向复盘
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (4)Elastix图像配准:3D图像
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (论文阅读30/100)Convolutional Pose Machines
  • (十六)一篇文章学会Java的常用API
  • (微服务实战)预付卡平台支付交易系统卡充值业务流程设计
  • (一)appium-desktop定位元素原理
  • (一)模式识别——基于SVM的道路分割实验(附资源)
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)Linq学习笔记
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .form文件_SSM框架文件上传篇
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET 给NuGet包添加Readme
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .net6 core Worker Service项目,使用Exchange Web Services (EWS) 分页获取电子邮件收件箱列表,邮件信息字段
  • .NET6 命令行启动及发布单个Exe文件
  • .NET中两种OCR方式对比
  • @font-face 用字体画图标
  • [2016.7.test1] T2 偷天换日 [codevs 1163 访问艺术馆(类似)]
  • [AR Foundation] 人脸检测的流程