双写一致:当修改了数据库的数据需要更新到缓存,保证数据的一致性
如何保证双写一致?
第一种对数据的一致性要求没有非常高的情况
解决方案:
延时双删
在修改数据前,删除缓存,修改成功后再次删除缓存,由后面的线程进行缓存的更新,控制脏读的情况。
为什么需要双删?
因为一次删除会出现脏读的情况,因为线程是交替执行的,
1 先写再删,在写操作完成前,其他线程可能会获取到旧数据
2 先删再写,在写操作完成前,其他线程如果未命中缓存,获取数据库旧数据并写入到缓存,即便写操作完成,后面的线程也无法获取最新数据。
第二种要求数据强一致性
分布式锁
可以通过redisson的读写锁实现,读锁(共享锁)允许其他线程读,写锁(互斥锁)阻塞其他线程读写
第三种 允许短暂的延时
通过异步通知保证数据最终的一致性
例:mq
当数据库写入完成后通知订阅方对缓存进行更新