Redis作为缓存,MySQL数据库如何与Redis保持一致性(双写一致性)?

Redis作为缓存,MySQL数据库如何与Redis保持一致性(双写一致性)?

双写一致性:

​ 修改了数据库中的数据的同时,也要更新缓存的数据,保证数据库和缓存中的数据保持一致。

请求数据的执行流程:

​ 请求去访问Redis,如果Redis缓存中有数据则返回数据,如果Redis缓存中没有数据则去查数据库,数据库把数据返回给请求之前将数据加载到缓存中,这样下次请求就可以在Redis缓存中执行。

保证一致性的方式:
一、延迟双删:(不保证数据的强一致性)

​ 是指在更新数据库之前先删除缓存,然后再去更新数据库,更新数据库后,再去延时删除缓存。

​ 之所以要延迟删除缓存是因为大多数的数据库并不是一个,一个数据库存在数据库损坏、宕机等问题。数据库需要做主从同步的操作,把数据库(主数据库)的数据同步到另一个数据库(从数据库)中,以实现数据的备份、负载均衡、灾难恢复等功能。数据库在做主从同步时有延迟。所以延迟双删,需要等待主从同步完成。

​ 缺点:不能确定主从同步完成的时间,如果没有数据同步完成,查询缓存时容易出现脏数据,所以延迟双删有查询出脏数据的风险。

主从同步详解:

​ 主从同步是指在数据库系统中,通常将一个数据库(主数据库)的数据同步到另一个数据库(从数据库)中,以实现数据的备份、负载均衡、灾难恢复等功能。

概念和步骤:
  1. 主数据库(Master):负责处理写操作和更新操作的数据库。所有的写操作都先在主数据库上执行。
  2. 从数据库(Slave):接收主数据库的变更,并进行同步,可以用于读操作或备份。从数据库通常是只读的,不允许直接对其进行写操作。
  3. 复制(Replication):指将主数据库的变更操作(如插入、更新、删除)同步到从数据库的过程。复制可以是异步的,也可以是半同步或同步的。
  4. 同步延迟(Replication Lag):主从同步中存在一定的延迟,即主数据库发生变更后,从数据库接收并应用这些变更之间的时间差。
工作原理:
  • 主数据库记录所有的数据变更操作,并将这些变更以日志形式发送给从数据库。
  • 从数据库接收到主数据库的变更日志后,按照相同的顺序和操作方式进行变更,从而保持与主数据库数据的一致性。
  • 当从数据库发生故障或需要切换时,可以快速切换到主数据库继续提供服务。
二、分布式锁(必须保证数据的强一致性)

通过加锁的方式,保证执行时只有一个线程去操作,其他线程需要等待有锁的线程释放锁。(性能太低)

可以通过加共享锁、排它锁提高性能。

**共享锁:**其他线程可以共享读的操作,在读操作时不能进行写的操作。

**排它锁:**线程在加锁后对其他线程阻塞,不允许其他线程进行读写操作。

缺点:

​ 虽然数据保持了强一致性,但是性能低。适用于对数据要求必须一致的业务使用。

三、异步通知(允许数据短暂的不一致性)

使用异步通知保证数据的最终一致性。

1、MQ(消息中间件)异步通知:

​ 当请求操作完数据库后,发送一个通知给MQ(消息中间件),在缓存服务中去监听MQ(消息中间件),收到通知后去更新Redis缓存。异步通知能够保证数据的最终一致性。主要是靠MQ(消息中间件)的可靠性。

2、基于Canal的异步通知:

​ 当MySQL数据库中的数据发生变化时(如插入、更新、删除操作),对应的binlog中会记录下这些数据变更事件,Canal接收到数据变更后,去通知缓存去更新数据。

**好处:**对于业务代码几乎是零侵入的。

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值