Skip to content

关于缓存的那些事

防御型编程

  • 缓存穿透, 不存在的 key
  • 缓存击穿, 单个缓存 key 失效, 缓存重建期间, 短时大量请求到达数据库
  • 缓存雪崩, 大量缓存 key 同时失效, 大量请求导致数据库崩溃

缓存穿透(Cache Penetration)

大量缓存根本无法命中的请求导致数据库查询。

因数据库不存在目标数据,导致缓存也无法重建。

最终会频繁查询数据库而造成负载。

原因

  • 恶意请求
  • 缺少必要的参数校验导致通信参数未符合预期
  • 上游服务同步等异常导致的数据不一致

解决

  • 增加参数校验
  • 对缓存重建失败的请求进行限流
  • 缓存重建的有效值校验
  • 通过布隆过滤器判断数据是否存在于数据库中,减少频繁的查询

缓存击穿(Cache Breakdown)/缓存雪崩(Cache Ava

缓存失效时,大量请求在缓存重建期间到达数据库。

缓存击穿可以由单个热点 key 引发。

缓存雪崩是指多个 key 同时失效。

原因

  • 缓存过期
  • 内存不足导致缓存写入失败
  • 内存不足因缓存策略导致热点key被替换

解决

  • 为过期时间添加随机数,避免同一时刻批量过期
  • 提前续期/永不过期
  • 限制缓存重建的并发数, 减少重建期间的压力