使用缓存的常见问题
缓存一致性
出现场景
@startuml
Application -[#F00]> Cache: 【更新】删除缓存
Application -[#00F]> Cache: 【查询】读取缓存
note right of Application: 更新操作和查询操作是两个并发请求
Cache -[#F00]> Cache: 【更新】删除缓存成功,但尚未更新数据库
Cache -[#00F]> Database: 【查询】没有命中缓存,读取数据库中的旧数据
Database -[#00F]> Cache: 【查询】更新旧数据至缓存
Cache -[#00F]> Application: 【查询】返回旧数据
Cache -[#F00]> Database: 【更新】更新数据库
Database -[#F00]> Database: 【更新】更新数据成功
Database -[#F00]> Cache: 【更新】没有更新新数据至缓存中
Cache -[#F00]> Application: 【更新】更新数据完成
note right of Cache: 此时缓存中的数据是旧数据
== 后续操作 ==
Application -[#00F]> Cache: 【查询】读取缓存
Cache -[#00F]> Application: 【查询】命中缓存,返回旧数据
@enduml解决方案
参考资料
缓存穿透(不存在 key)
出现场景
解决方案
缓存雪崩(多个 key 失效)
出现场景
解决方案
缓存击穿(热点 key 失效)
出现场景
解决方案
方案一
方案二
最后更新于