Redis作为缓存,它是如何与MySQL的数据保持同步的呢?特别是在追求双写一致性的道路上,我们该如何操作呢?
其实有两种情况需要讨论:
数据高度一致性:加锁数据同步可以有延时 中间件通知(MQ、Canal)延迟双删(先删除缓存、再修改数据库,经过一段时间,再次删除缓存) 10.2数据高度一致性想要达到强一致性,我们可以借助Redisson提供的读写锁哦!
共享锁(读锁readLock):一旦加上这个锁,其他线程就可以共享读操作,不会互相干扰,真是好帮手!排他锁(独占锁writeLock):这个锁更霸道,一旦加上,其他线程就别想读写操作了,得乖乖等着。 10.3数据同步允许延时 10.3.1中间件通知 MQ中间件:数据更新后,就通知缓存删除。Canal中间件:Canal伪装成MySQL的从节点,通过读取binlog数据来更新缓存,神奇又方便,而且不需要改业务代码哦! 10.3.2延迟双删 延时双删听起来挺高级,但实际操作起来有点复杂。在更新数据库后,首次删除缓存中的数据,然后经过一段预定的延时(通常是几百毫秒到几秒),再次删除缓存中可能仍然存在的数据。这个延时的目的是为了确保数据库的更新操作能够完成,避免旧的缓存数据被重新读取。第一次删除是为了避免在延时期间有新的请求使用到旧的缓存数据,第二次删除则是在数据库更新完成后彻底移除旧数据,以保持数据一致性。