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

Redis和Mysql如何保持数据一致性

一般情况下,Redis是用来实现应用和数据库之间读操作得缓存层,主要目的是减少数据库IO,还可以提升数据的IO性能。

当应用程序需要去读取某个数据时,会首先尝试去Redis里面加载,如果命中就直接返回,如果没有命中,就去从数据库中查询,查询到数据之后再把这个数据缓存到Redis里。

 如果一份数据,同时保存在数据库和Redis里面,当数据发生变化时,需要同时去更新Redis和Mysql,由于更新是有先后顺序的,并且他不像Mysql中多表事务操作,可以满足ACID特性,和会出现数据一致性的问题

这种情况下,只有两种方法:

1.先更新数据库,在更新缓存

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

如果先更新数据库,在更新缓存,如果缓存更新失败,会导致数据不一致

如果是先删除缓存,在更新数据库,理想是应用下次访问Redis时,发现Redis里面是空的,就从数据库中加载保存到Redis,那么数据是一致的。但是会有极端情况,由于删除Redis和更新数据库这两个操作不是原子的,所以这个过程如果有其他线程来访问,还是会存在数据不一致的情况。

 所以在极端情况下,如果依旧想保持数据一致性,就需要采用最终一致性方案。

比如,基于RocketMQ的可靠性消息通信,来实现最终一致性。

还可以直接通过Canal组件,监控Mysql中binlog日志,把更新后的数据同步到Redis里面。

因为这里是基于最终一致性来实现的,如果业务场景不能接受数据的短期不一致性,那就不能使用这个 方案来做。
以上就是我对这个问题的理解。谢谢大家

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • python opencv 绘制多边形 闭合
  • 极简聊天室-websocket版
  • 【Vue3】具名插槽
  • 后端笔记(1)--javaweb简介
  • 【玩转python】入门篇day14-函数
  • Laravel序列化解码:深入Eloquent模型的序列化机制
  • 如何构建自己的交易机器人开发环境
  • 【机器学习】逻辑损失函数的基本概念和探索为什么平方误差损失函数不适用于逻辑回归以及探索逻辑损失函数
  • 基于supervisor制作基于环境变量配置的redis
  • MyBatis动态代理和映射器
  • 橙篇AI做产品经理,比Kimi爽多了
  • gpio的使用,---->使用sysfs 控制gpio(第二节)
  • RabbitMQ:MQ的可靠性
  • C#实现数据采集系统-系统优化服务封装
  • 捷行推出2024年8月专属福利活动
  • (三)从jvm层面了解线程的启动和停止
  • CAP 一致性协议及应用解析
  • docker python 配置
  • ES学习笔记(12)--Symbol
  • MD5加密原理解析及OC版原理实现
  • MySQL-事务管理(基础)
  • Odoo domain写法及运用
  • PAT A1050
  • Python实现BT种子转化为磁力链接【实战】
  • Python语法速览与机器学习开发环境搭建
  • ReactNativeweexDeviceOne对比
  • Redis的resp协议
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 关于springcloud Gateway中的限流
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 两列自适应布局方案整理
  • 我与Jetbrains的这些年
  • 一起参Ember.js讨论、问答社区。
  • 用mpvue开发微信小程序
  • Nginx实现动静分离
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​14:00面试,14:06就出来了,问的问题有点变态。。。
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • #pragma once
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第6节 (嵌套的Finally代码块)
  • (done) 两个矩阵 “相似” 是什么意思?
  • (JS基础)String 类型
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (生成器)yield与(迭代器)generator
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (已解决)vue+element-ui实现个人中心,仿照原神