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

mysql和redis的双写一致性问题

一,使用方案

在使用redis作为缓存的场景下,我们一般使用流程如下

在这里插入图片描述

二,更新数据场景

我们此时修改个某条数据,如何保证mysql数据库和redis缓存中的数据一致呢?
按照常规思路有四种办法,1.先更新mysql数据,再更新缓存数据 2.先更新缓存数据,再更新mysql数据
3.先删除缓存,再更新mysql数据 4.先更新mysql数据,再删除缓存 。
这四种方法各有各的弊端,并不能完全保证数据一致性,采用“先写 MySQL,再删除 Redis”的策略,这种情况虽然也会存在两者不一致,但是需要满足的条件有点苛刻,所以是满足实时性条件下,能尽量满足一致性的最优解。对于不是强一致性要求的业务,可以容忍。(什么情况下不能容忍呢,比如秒杀业务、库存服务等。)
为什么采用删除缓存而不是更新缓存,是因为高并发下产生脏数据的要求要比更新缓存的要求更多,也就是删除缓存产生脏数据的概率更小一些。
那么问题又来了,在高并发的情况下
采用先删除缓存,再更新数据库

  • 请求A来了,删除缓存
  • 请求A更新数据库,发生卡顿,同时来了请求B
  • 请求B发现没有缓存,就从数据库查询了数据,并生成了缓存
  • 此时请求A卡顿结束,更新了数据库
    这个情况下,缓存中的就是脏数据。我们采用延时双删来解决
    在这里插入图片描述
    那么问题又来了,第二次删除缓存失败了怎么办?看下面
  • 先更新数据库,再删除缓存
    如果删除缓存失败,怎么保证数据一致性?
    1.使用重试机制,可以直接在接口中重试,但是比较耗费性能
    2.使用异步队列重试
    3.使用rabbitmq消息中间件来处理
    当用户操作写完数据库,但删除缓存失败了,产生一条mq消息,发送给mq服务器。
    mq消费者读取mq消息,重试5次删除缓存。如果其中有任意一次成功了,则返回成功。如果重试了5次,还是失败,则写入死信队列中。
    当然在该方案中,删除缓存可以完全走异步。即用户的写操作,在写完数据库之后,不用立刻删除一次缓存。而直接发送mq消息,到mq服务器,然后有mq消费者全权负责删除缓存的任务。
    因为mq的实时性还是比较高的,因此改良后的方案也是一种不错的选择。

总结:以上方法只能保证最终一致性,不能保证强一致性

相关文章:

  • Qt | QDataStream 类(数据流)
  • 敏捷=996/007?现实是……
  • 【通过新能源汽车的智慧数字底盘技术看计算机的相关技术堆栈?以后是软硬结合的全能程序员的天下,取代全栈(前后端都会的全栈程序员)】
  • 怎么做才能推动产业园区的数字化转型和升级
  • 独孤思维:每天做着自己不喜欢的工作,你不难受吗
  • uniapp面试题
  • 【docker hub镜像源失效】2024年6月6日 docker 国内镜像源失效
  • RestTemplate远程请求的艺术
  • echarts写某个市地图
  • 如何进行LLM大模型推理优化
  • [大模型]Qwen2-7B-Instruct 接入 LangChain 搭建知识库助手
  • CSS实现经典打字小游戏《生死时速》
  • 【Windows】配置Flutter开发环境
  • ArrayList和LinkedList的区别!!!
  • 文献学习——PWM - PFM模式无缝转换的PFC变换器统一控制
  • [译] 怎样写一个基础的编译器
  • 【前端学习】-粗谈选择器
  • CentOS 7 修改主机名
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • CSS魔法堂:Absolute Positioning就这个样
  • Hexo+码云+git快速搭建免费的静态Blog
  • input的行数自动增减
  • Js基础知识(四) - js运行原理与机制
  • laravel5.5 视图共享数据
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • MySQL的数据类型
  • Python 反序列化安全问题(二)
  • springMvc学习笔记(2)
  • vagrant 添加本地 box 安装 laravel homestead
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 给github项目添加CI badge
  • 基于遗传算法的优化问题求解
  • 前端
  • 前端之Sass/Scss实战笔记
  • 前端自动化解决方案
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 深度学习中的信息论知识详解
  • 使用Gradle第一次构建Java程序
  • 跳前端坑前,先看看这个!!
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 小程序开发之路(一)
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • ​ArcGIS Pro 如何批量删除字段
  • ​TypeScript都不会用,也敢说会前端?
  • $refs 、$nextTic、动态组件、name的使用
  • (初研) Sentence-embedding fine-tune notebook
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (四)鸿鹄云架构一服务注册中心
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (一) storm的集群安装与配置
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (转) 深度模型优化性能 调参
  • (转)人的集合论——移山之道
  • .aanva