Redis和Mysql如何保证数据一致性?

Redis常用于作为应用与数据库之间的缓存层,提高读取效率并减轻数据库IO压力。文章探讨了数据一致性问题,包括先更新数据库再更新缓存及先删除缓存再更新数据库两种策略的优缺点,并提出在极端情况下采用基于RocketMQ的事务消息或Canal组件从数据库binlog同步数据来保障最终一致性。若业务对即时一致性要求高,这些方案可能不适用。
摘要由CSDN通过智能技术生成
Redis的作用

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

整体架构

redis架构

  1. 命中缓存从缓存加载数据,直接返回
  2. 没有命中缓存,从数据库加载加载数据
  3. 加载到的数据写入缓存
原理

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

如何保证数据一致性
  1. 先更新数据库,再更新缓存
  2. 先删除缓存,再更新数据库
第一种情况的缺点

redis更新

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

第二种情况的缺点

在这里插入图片描述

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

如何保证数据一致性

如果需要在极端情况下仍然去保证Redis和Mysql的数据一致性就只能采用最终一致性的一个方案
3

基于RocketMq的可靠性通信
  1. 更新数据库的数据
  2. 更新redis的数据
  3. 失败的请求写入mq事务消息
  4. 异步重试,确保成功
基于canal组件
  1. 更新数据库的数据
  2. 更新redis的数据
  3. 从binlog加载数据
  4. 同步到Redis里面

如果业务不能接受短期的不一致性,那么就不能这样的一个方案来实现

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

请叫我黄同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值