三种更新策略:
先更新数据库,再更新缓存(线程不安全)
1、线程A更新了数据库;
2、线程B更新了数据库;
3、线程B更新了缓存;
4、线程A更新了缓存;
数据库是B写入的值,而缓存中是A写入的旧值
写多读少的场景,频繁写缓存很浪费性能;
先删缓存,再更新数据库(线程不安全)
1、线程A删除了缓存;
2、线程B查询缓存发现不存在;
3、线程B更新了缓存;
4、线程A写入了数据库;
数据库是A写入的值,而缓存中是B写入的旧值
可以使用延时双删策略进行优化;
延时双删:
- 先删除缓存;
- 再写入数据库;
- 异步发消息,再去删除一次缓存;
先更新数据库,再删除缓存
这种方案最好,但是有极低的概率会发生不一致的情况;
1、缓存刚好失效;
2、线程A去数据库读取数据;
3、线程B写入数据库;
4、线程B删除缓存;
5、线程A写入缓存;
数据库中是B写入的新值,而缓存中是A写入的旧值
PS:这种情况发生的概率极低,因为读取数据库到写入缓存所花费的时间应该远远低于B操作的时间,如果真的发生了,用发消息来删除的方案也可以解决;