缓存穿透、缓存击穿和缓存雪崩

154 阅读1分钟

缓存穿透:

概念:用户需要查询一个数据,缓存中没有,也就是没有命中,于是向数据库中发起请求,发现也没有。当用户很多的时候,缓存都没有命中,于是都去请求数据库,这给数据库造成很大的压力。

解决方案

  • 布隆过滤器:是一种数据结构,对所有可能查询的参数以 hash 方式存储,先在控制层进行校验,不符合则丢弃,避免了过多访问数据库。
  • 缓存空对象:当存储层没有命中时,即使返回空对象也将其缓存起来。(意味着更多的空间存储,即使设置了过期时间,缓存和数据库还是有段时间数据不一致。)

缓存击穿:

概念:当一个 key 非常热点时,在不断扛高并发,集中对这个热点数据进行访问,当这个 key 失效的瞬间,请求直接到达数据库,给数据库瞬间的高压力。

解决方案

  • 设置热点数据永不过期
  • 加分布式锁:保证每个 key 同时只有一个线程去查询后端服务。

缓存雪崩:

概念:某个时间段,缓存集中失效

解决方案

  • 增加 Redis 集群的数量
  • 缓存过期时间的时候,错峰设置
  • 限流降级:在缓存失效后,通过加锁和队列来控制数据库写缓存的线程数量
  • 数据预热:正式部署之前,将数据预先访问一遍,让缓存失效的时间尽量均匀