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接收到数据变更后,去通知缓存去更新数据。

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

posted @   代码忍者  阅读(207)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· spring官宣接入deepseek,真的太香了~
点击右上角即可分享
微信分享提示