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

Redis和MySQL如何保证数据一致性

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

这是它的整体架构

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

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

在这种情况下,能够选择的方法只有几种。

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

如果先更新数据库,再更新缓存,如果缓存更新失败,就会导致数据库和 Redis 中的数据不一致。

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

所以,如果需要在极端情况下仍然保证Redis和MySQL的数据一致性,就只能采用最终一致性方案。如下图,比如基于RocketMQ的可靠性消息通信,来实现最终一致性。

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

因为这里是基于最终一致性来实现的,如果业务场景不能接收数据的短期不一致性,那就不能使用这个方案来做。 


http://www.kler.cn/a/369821.html

相关文章:

  • c语言中的数组(上)
  • 【大数据】机器学习----------强化学习机器学习阶段尾声
  • 科技快讯 | 理想官宣:正式收费!WeChat 港币钱包拓宽商户网络;百川智能发布深度思考模型Baichuan-M1-preview
  • 面向程序员的Lean 4教程(2) - 数组和列表
  • Pyecharts图表交互功能提升
  • K8S中的数据存储之基本存储
  • SQLAlchemy 连接 dm
  • 基于Multisim的单双声道音频功率放大电路设计与仿真
  • 哈希及其封装实现unordermap和set
  • PSI-BLAST位点特异性矩阵PSSM和ProteinMPNN中氨基酸顺序映射
  • 华为OD机试真题---字符串摘要
  • 【含开题报告+文档+PPT+源码】基于SSM的旅游与自然保护平台开发与实现
  • 重工业数字化转型创新实践:某国家特大型钢铁企业如何快速落地基于实时数仓的数据分析平台
  • 开源模型应用落地-qwen模型小试-Qwen2.5-7B-Instruct-玩转ollama(一)
  • 【最新华为OD机试E卷-支持在线评测】机器人活动区域(200分)多语言题解-(Python/C/JavaScript/Java/Cpp)
  • 如何通过自动化有效地简化 Active Directory 操作?
  • Java基于微信小程序的童装商城的设计与实现,附源码+文档
  • 使用语言模型进行文本摘要的五个级别(llm)
  • 51单片机 复位电路
  • 解决Redis缓存穿透(缓存空对象、布隆过滤器)
  • k8s部署metallb实现service的LoadBalancer模式
  • 微信小程序地图功能开发:绘制多边形和标记点
  • kotlin等待异步任务完成
  • 100种算法【Python版】第18篇——Prim算法
  • 使用 `screen` + `nohup` 实现高效日志记录和多环境任务管理
  • electron的常用api