1、更新了数据库,再更新缓存
假设数据库更新成功,缓存更新失败,在缓存失效和过期的时候,读取到的都是老数据缓存。
2、更新缓存,更新数据库
缓存更新成功了,数据库更新失败,是不是读取的缓存的都是错误的。
以上两种,全都不推荐。
3、先删除缓存,再更新数据库
有一定的使用量。即使数据库更新失败。缓存也可以会刷。
存在的问题是什么?
高并发情况下!!
比如说有两个线程,一个是 A 线程,一个是 B 线程。
A 线程把数据删了,正在更新数据库,这个时候 B 线程来了,发现缓存没了,又查数据,又放入缓存。缓存里面存的就一直是老数据了。
延迟双删。更新完数据库之后,我再删一次。
扩展思路
1、消息队列补偿
删除失败的缓存,作为消息打入 mq,mq 消费者进行监听,再次进行重试刷缓存。
2、canal
监听数据库的变化,做一个公共服务,专门来对接缓存刷新。优点业务解耦,业务太多冗余代码复杂度。
相关文章
- 缓存与数据一致性问题
- Django与Vue语法冲突问题完美解决方法
- vue2 bug 小白求助!!!(未解决,大概是浏览器缓存的问题或者是路由的问题)
- 【TensorFlow深度学习】过拟合问题剖析:模型容量与欠拟合辨析
- [C#] .NET Core项目修改project.json来引用其他目录下的源码等文件的办法 & 解决多框架时 project.json 与 app.config冲突的问题
- 本地缓存组件Caffeine,与guava、map、ehcache对比
- 【缓存】框架层常见问题和对策-Q 双写不一致问题:
- 如何优雅实现存算分离:缓存及Tablespace讲解与演示
- 单元测试Mock中常见问题与解决方案
- 接口性能测试复盘:解决JMeter超时问题的实践-总结与启示: