缓存模式是什么
缓存模式决定读写路径如何与缓存交互。旁路缓存最常见:读未命中就查库并回填,写时更新数据库后删除缓存。读穿把回填逻辑集中到缓存层,写穿同步写缓存与数据库,写回只写缓存并异步刷库,吞吐最高但宕机时可能丢数据。
为什么删除而不是更新
并发更新与读回填交错时,更新缓存容易留下旧值:两次写请求的完成顺序与缓存写入顺序不一致,就会把较早的数据留在缓存里。删除缓存让下一次读取重新回填,多一次查询换来了确定性。删除后仍需处理缓存与数据库双写失败,通常配合消息补偿或定期刷新兜底。
四种模式
| 模式 | 读行为 | 写行为 |
|---|---|---|
| 旁路缓存 | 命中返回,未命中查库回填 | 更新数据库后删除缓存 |
| 读穿 | 缓存层代为查库回填 | 逻辑集中在缓存层,调用方不感知 |
| 写穿 | 同旁路缓存 | 同步写缓存与数据库 |
| 写回 | 同旁路缓存 | 先写缓存,异步刷回数据库 |
常见风险与对策
| 缓存击穿 | 热点键过期瞬间大量请求回源,可用互斥重建或预热缓解 |
|---|---|
| 缓存穿透 | 查询不存在的键,可缓存空值或做参数校验 |
| 缓存雪崩 | 大批键同时过期,过期时间加随机抖动 |
| 脏数据兜底 | 设置过期时间,防止异常路径留下的旧值长期存活 |
典型使用场景
- 热点数据读加速:商品详情、配置与字典表
- 会话与登录态缓存:降低中心存储压力
- 限流与计数:用原子操作支撑高频计数
- 跨服务共享计算结果:避免重复的高成本计算
- 降低数据库读压力:把高频只读查询挡在缓存层
删除缓存比更新缓存更稳妥:并发更新与读回填交错时,更新缓存容易留下旧值,而且这类脏数据往往只有在下一次写入时才被覆盖。