首先感谢某马老师的详细讲解让我醍醐灌顶!!!本文章为学习笔记
问题:redis作为缓存,mysql的数据如何与redis进行同步?
双写一致性:当修改了数据库的数据同时更新redis缓存的数据,缓存和数据库必须要保持一致性(强一致性或者最终一致性都行反正就是一致即可)
解决方案一:延迟双删
如果是写操作,我们先把缓存中的数据删除,然后更新数据库,最后再延时删除缓存中的数据
可以通过两次删除缓存来控制脏数据,但是延迟的时机很难把握,所以无法完全杜绝脏数据,不能做到强一致性
强一致性的解决方案
解决方案一:分布式锁(强一致性但是性能较低)
解决方案二:读写锁(性能比分布式锁要好一点点)
适用于读多写少的情况
共享锁:读锁readLock,加锁以后,其他线程可以共享读操作
排他锁:独占锁writeLock,加锁以后,阻塞其他线程读写操作
最终一致性的解决方案:异步通知
基于MQ的异步通知
当我们修改数据写入到mysql以后,就会发一条消息给MQ,在缓存服务这一块就要去监听mq,然后再去更新mq即可。缓存修改肯定是有延迟的,需要保证MQ的可靠性