目录
如何保证缓存与数据库的双写一致性
只要使用到缓存,无论是本地内存做缓存还是使用 redis
做缓存,那么就会存在缓存与数据库同步的问题,接下来就讨论一下关于保证缓存和数据库双写时的数据一致性
我们这里列出来所有策略,并且讨论他们优劣性
- 先更新数据库,后更新缓存(不建议采用)
- 先更新缓存,后更新数据库(不建议采用)
- 先删除缓存,后更新数据库(不太理想,可以采用)
- 先更新数据库,后删除缓存(建议采用)
先更新数据库,后更新缓存(不建议采用)
这套解决方案,大家普遍反对的,一般是没有人使用的
原因一(会产生缓存与数据库数据不一致):在高并发的场景下,如果同时有请求 A
和请求 B
进行获取数据,那么会出现
- 请求
A
更新了数据库 - 请求
B
也更新了数据库 - 请求
B
更新了缓存 - 请求
A
更新了缓存
这就出现了请求 A
更新缓存应该比请求 B
更新缓存早才对,但是因为网络等原因,B
却比 A
更早更新了缓存。这就导致了脏数据,因此不考虑
原因二(业务场景角度)
- 如果你是一个写数据库场景比较多,而读数据场景比较少的业务需求,采用这种方案就会导致,数据压根还没读到,缓存就被频繁的更新,浪费性能
- 如果你写入数据库的值,并不是直接写入缓存的,