缓存的设计模式
- Cache Aside(旁路缓存) 一致性要求
- Read / Write Through(读写穿透) 系统隔离
- Write Behind Caching(异步缓存写入) 数据大量写 点赞计数需求
ref
https://blog.csdn.net/hualaoshuan/article/details/102638188
具体策略 |
策略描述 |
优点 |
缺点 | ||
---|---|---|---|---|---|
更新策略 (缓存更新时机不同。影响数据准确性) |
实时更新 |
源数据新增或更新后,立即更新缓存 |
1、数据实时性高 2、数据一致性高 |
1、若数据更新机制和触发时机很多且复杂,缓存数据一致性维护成本高。有遗漏数据更新场景导致数据不一致的风险 2、缓存不能设置过期时间,冷访问数据占用内存 3、新增缓存需要刷历史数据 |
|
延迟更新 |
轮询主动更新 |
每间隔一段时间查询最新数据,并更新缓存 |
1、缓存数据维护简单统一 2、新增缓存无需刷历史数据 |
1、短时间内数据不准确(轮询时间间隔) 2、需考虑轮询时间如何设置 3、需考虑每次轮询哪些数据 4、不区分冷热数据,冷访问数据会占用内存 |
|
读请求触发同步更新 |
读未命中(包括缓存过期),则查询源数据,更新缓存,并返回结果。 |
1、缓存数据维护简单统一 2、新增缓存无需刷历史数据 3、冷访问数据会自动过期,减少内存占用 4、开发简单 |
1、短时间内数据不准确(必须设置过期时间) 2、需考虑过期时间如何设置 3、要考虑源数据为空时,回种空值问题,否则会出现缓存穿透。若回种空值则可能占用大量内存
|
||
读请求触发异步更新 |
读未命中(包括缓存过期),则发布异步事件,更新缓存。 |
||||
读取策略(影响接口性能)
|
只读缓存(cache-only) |
依赖缓存数据,缓存未命中则返回空。 |
1、响应时间更快 |
1、数据准确性由选择的更新策略决定。不与【读请求触发同步更新】策略结合使用 2、需要保证缓存组件高可用 |
|
读穿(read-through) |
读未命中,则查询源数据,更新缓存,并返回结果。 |
1、rpc调用兜底,不会出现有数据却不展示的情况 |
1、数据准确性由选择的更新策略决定。不与【读请求触发异步更新】策略结合使用 2、若未命中,响应时间慢 |
--
缓存更新的套路
https://coolshell.cn/articles/17416.html
--
cache aside
可能的问题