引言
- 最近面试快手的时候被问到了缓存不一致怎么解决?一开始还是很懵的,因为会默认将自己带到一个错误的前提下,就是数据已经不一致了,你怎么办?可能会想,遍历缓存,删除比对数据是不是一致的。停下来想一下,一般是修改数据库的时候,你应该怎么操作缓存,才能保证缓存的一致性。我就知道要么删除缓存后续重建,要么直接修改缓存,但是我对于这两种场景的方法了解的并不多,今天借这个机会,完全整理一下!
正文
数据一致分几种情况?
- 缓存中有数据,必须要和数据库中的数据一致
- 缓存中本身没有数据,数据库中的值必须要是最新的
常见的缓存的策略主要有两种,分别是读写缓存和只读缓存,不同策略保证缓存一致性的方式是不一样。具体如下
读写缓存的数据一致性
- 读写缓存是对于数据的所有增删改都需要在缓存中进行,然后在采取对应的写回策略。主要有两种写回策略
- 同步直写策略
- 异步写回策略
同步直写策略
- 写缓存的时候,同步写数据库,缓存和数据库中的数据是一致的。
- 需要通过事务机制,保证缓存和数据库更新的原子性,一般是通过tranactional修饰
- 要么同步更新成功
- 要么同步更新失败,下次重试
- 需要通过事务机制,保证缓存和数据库更新的原子性,一般是通过tranactional修饰
异步写回策略
- 写缓存的时候,不同步写入缓存,等到数据从缓存中淘汰的时候,在写入数据库。
- 问题
- 一旦缓存崩溃,在缓存中保存的数据,都会崩溃丢失
- 问题
只读缓存的数据一致性
-
如果有数据更新(数据增加和修改),直接写入数据库&#