redis作为缓存,mysql的数据如何与redis进行同步呢?
设置前提(业务场景):
一致性要求高
允许延迟一致
双写一致性:当修改了数据库的数据也要同时更新缓存数据,缓存和数据库数据要保持一致
读操作:缓存命中,直接返回;缓存未命中查询数据库,写入缓存,设定超时时间
写操作:延迟双删
删除缓存--------------------> 修改数据库-------------------->删除缓存
1.先删除缓存、还是先修改数据库:都会导致脏数据出现
2.为什么要删除两次缓存? 避免脏数据出现
3.为什么要延时删除? 主从模式,读写分离,同步数据不确定延时时间也有脏数据
redis中缓存数据为 读多写少,所以我们可以用共享锁和排他锁
读写锁可以保证强一致,但是性能低
共享锁:读锁readLock,加锁后,其他线程可以共享读操作
排他锁:独占锁writeLock也叫写锁,加锁后,阻塞其他线程读写操作
允许延时一致的业务,采用异步通知
1、使用MQ中间件,更新数据后,通知缓存删除
2、利用canal中间件,不需要修改业务代码,伪装为MySQL的一个从节点,canal通过读取binlog数据更新缓存
强一致性的话,采用Redisson提供的读写锁
1、共享锁:读锁readLock,加锁后,其他线程可以共享读操作
2、排他锁:独占锁writeLock也叫写锁,加锁后,阻塞其他线程读写操作