Redis作为缓存,MySQL数据库如何与Redis保持一致性(双写一致性)?
双写一致性:
修改了数据库中的数据的同时,也要更新缓存的数据,保证数据库和缓存中的数据保持一致。
请求数据的执行流程:
请求去访问Redis,如果Redis缓存中有数据则返回数据,如果Redis缓存中没有数据则去查数据库,数据库把数据返回给请求之前将数据加载到缓存中,这样下次请求就可以在Redis缓存中执行。
保证一致性的方式:
一、延迟双删:(不保证数据的强一致性)
是指在更新数据库之前先删除缓存,然后再去更新数据库,更新数据库后,再去延时删除缓存。
之所以要延迟删除缓存是因为大多数的数据库并不是一个,一个数据库存在数据库损坏、宕机等问题。数据库需要做主从同步的操作,把数据库(主数据库)的数据同步到另一个数据库(从数据库)中,以实现数据的备份、负载均衡、灾难恢复等功能。数据库在做主从同步时有延迟。所以延迟双删,需要等待主从同步完成。
缺点:不能确定主从同步完成的时间,如果没有数据同步完成,查询缓存时容易出现脏数据,所以延迟双删有查询出脏数据的风险。
主从同步详解:
主从同步是指在数据库系统中,通常将一个数据库(主数据库)的数据同步到另一个数据库(从数据库)中,以实现数据的备份、负载均衡、灾难恢复等功能。
概念和步骤:
- 主数据库(Master):负责处理写操作和更新操作的数据库。所有的写操作都先在主数据库上执行。
- 从数据库(Slave):接收主数据库的变更,并进行同步,可以用于读操作或备份。从数据库通常是只读的,不允许直接对其进行写操作。
- 复制(Replication):指将主数据库的变更操作(如插入、更新、删除)同步到从数据库的过程。复制可以是异步的,也可以是半同步或同步的。
- 同步延迟(Replication Lag):主从同步中存在一定的延迟,即主数据库发生变更后,从数据库接收并应用这些变更之间的时间差。
工作原理:
- 主数据库记录所有的数据变更操作,并将这些变更以日志形式发送给从数据库。
- 从数据库接收到主数据库的变更日志后,按照相同的顺序和操作方式进行变更,从而保持与主数据库数据的一致性。
- 当从数据库发生故障或需要切换时,可以快速切换到主数据库继续提供服务。
二、分布式锁(必须保证数据的强一致性)
通过加锁的方式,保证执行时只有一个线程去操作,其他线程需要等待有锁的线程释放锁。(性能太低)
可以通过加共享锁、排它锁提高性能。
共享锁:其他线程可以共享读的操作,在读操作时不能进行写的操作。
排它锁:线程在加锁后对其他线程阻塞,不允许其他线程进行读写操作。
缺点:
虽然数据保持了强一致性,但是性能低。适用于对数据要求必须一致的业务使用。
三、异步通知(允许数据短暂的不一致性)
使用异步通知保证数据的最终一致性。
1、MQ(消息中间件)异步通知:
当请求操作完数据库后,发送一个通知给MQ(消息中间件),在缓存服务中去监听MQ(消息中间件),收到通知后去更新Redis缓存。异步通知能够保证数据的最终一致性。主要是靠MQ(消息中间件)的可靠性。
2、基于Canal的异步通知:
当MySQL数据库中的数据发生变化时(如插入、更新、删除操作),对应的binlog中会记录下这些数据变更事件,Canal接收到数据变更后,去通知缓存去更新数据。
好处:对于业务代码几乎是零侵入的。
标签:缓存,数据库,Redis,同步,MySQL,一致性,数据 From: https://www.cnblogs.com/My-knowledge/p/18079785