缓存模式

旁路缓存(Cache-Aside)最常见:读未命中查库回填,写时删除缓存;读穿、写穿、写回各有取舍,写回吞吐高但可能丢数据。

缓存模式是什么

缓存模式决定读写路径如何与缓存交互。旁路缓存最常见:读未命中就查库并回填,写时更新数据库后删除缓存。读穿把回填逻辑集中到缓存层,写穿同步写缓存与数据库,写回只写缓存并异步刷库,吞吐最高但宕机时可能丢数据。

为什么删除而不是更新

并发更新与读回填交错时,更新缓存容易留下旧值:两次写请求的完成顺序与缓存写入顺序不一致,就会把较早的数据留在缓存里。删除缓存让下一次读取重新回填,多一次查询换来了确定性。删除后仍需处理缓存与数据库双写失败,通常配合消息补偿或定期刷新兜底。

四种模式

模式读行为写行为
旁路缓存命中返回,未命中查库回填更新数据库后删除缓存
读穿缓存层代为查库回填逻辑集中在缓存层,调用方不感知
写穿同旁路缓存同步写缓存与数据库
写回同旁路缓存先写缓存,异步刷回数据库

常见风险与对策

缓存击穿热点键过期瞬间大量请求回源,可用互斥重建或预热缓解
缓存穿透查询不存在的键,可缓存空值或做参数校验
缓存雪崩大批键同时过期,过期时间加随机抖动
脏数据兜底设置过期时间,防止异常路径留下的旧值长期存活

典型使用场景

  • 热点数据读加速:商品详情、配置与字典表
  • 会话与登录态缓存:降低中心存储压力
  • 限流与计数:用原子操作支撑高频计数
  • 跨服务共享计算结果:避免重复的高成本计算
  • 降低数据库读压力:把高频只读查询挡在缓存层
删除缓存比更新缓存更稳妥:并发更新与读回填交错时,更新缓存容易留下旧值,而且这类脏数据往往只有在下一次写入时才被覆盖。

易错点

  • 先删缓存再写数据库,并发读在中间回填旧值,留下长期脏数据
  • 写回模式未评估宕机丢数据的业务后果,重启后数据无法恢复
  • 缓存未设过期时间,异常写入的脏值永久存活
  • 大批缓存键同时过期没有抖动,过期瞬间数据库被回源流量打满

数据来源与参考

  • AWS 白皮书:Database Caching Strategies Using Redis
  • Redis 文档:缓存模式(Caching patterns)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌