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