场景描述
比如一条数据同时存在数据库、缓存,现在你要更新此数据,你会怎么更新?
先更新数据库?还是先更新缓存?
其实这两种方式都有问题。
(1)先更新数据库,后更新缓存
image这样会造成数据不一致。
imageA 先把数据库更新为 123,由于网络问题,更新缓存的动作慢了。
这时,B 去更新数据库了,改为了 456,紧接着把缓存也更新为 456。
现在 A 更新缓存的请求到了,把缓存更新为了 123。
那么这时数据就不一致了,数据库里是最新的 456,而缓存是 123,是旧数据。
因为数据库更新、缓存更新这2个动作不是原子的,在高并发操作时,这2个动作直接会插入其他动作。
(2)先更新缓存,再更新数据库
image同样可能数据不一致。
image缓存更新成功,数据为最新的,但数据库更新失败,回滚了,还是旧数据。
还是非原子操作的原因。
Cache Aside 策略
其实,在更新数据时,我们可以不更新缓存,而是删除缓存中的数据,在读取数据时,发现缓存中没有,再从数据库中读取数据,更新到缓存中。
这就是 Cache Aside 策略(旁路缓存策略)。
- 读策略步骤
- 写策略步骤
写时可以不可以先删除缓存?不行!
例如这个场景:
imageA 先删了缓存,还没等数据库更新完成呢,就被 B 把缓存更新为了旧值。
- 注意
Cache Aside 策略也是不保证数据一致性的,它的作用是大大减少不一致性。
某些极端情况还是存在不一致,如果业务上不允许,可以考虑加分布式锁。
image
网友评论