场景
系统使用redis等缓存来提高读性能
-
读请求
先读缓存,如果缓存不存在,则从数据库读取,并重建缓存; 同时,写入缓存中的数据,都设置失效时间
-
写请求
修改一条数据时,不仅要更新数据库,也要连带缓存一起更新。
缓存一致性的重点
可能的方案
一下几种方案在并发
和异常
的情况下都会存在不一致问题
更新缓存和更新数据库
先更新缓存,后更新数据库
先更新数据库,后更新缓存
缓存利用率低:每次数据发生变更,都「无脑」更新缓存,但是缓存中的数据不一定会被「马上读取」,这就会导致缓存中可能存放了很多不常访问的数据,浪费缓存资源
删除缓存和更新数据库
先删除缓存,后更新数据库
先更新数据库,后删除缓存
推荐方案
推荐 先更新数据库,后删除缓存
- 为避免更新数据库成功,而删除缓存失败,所以需要重试,我们使用异步删除的策略,引入消息队列,由消费者删除缓存,消费者删除失败需要重试
- 考虑到数据库读
写分离+主从复制
,所以发送给MQ的为延时消息
参考博客
https://baijiahao.baidu.com/s?id=1710566894419278870