Redis缓存击穿,穿透,雪崩

43 阅读1分钟

缓存击穿

大量请求落到热点key上,但是热点Key失效或者过期,请求直接“戳”到数据库上,造成数据库压力过大。 解决方法:

  • 设置热点Key永不过期
  • 接口限流,熔断,降级
  • 互斥锁,确保key过期的一瞬间,只有一个线程在查询DB重建缓存数据,供后续的线程去查询缓存。

image.png

image.png

缓存雪崩

同一时间段大量的缓存key同时失效或者redis服务宕机,导致大量请求到达数据库,带来巨大压力 解决方案:

  • 给不同的key增加不同TTL时间
  • 如果缓存数据库是分布式部署,将热点数据均匀分布在不同的缓存数据库中
  • 设置热点数据永远不过期

缓存穿透

缓存穿透指客户端请求的数据在缓存中和数据库中都不存在,这样缓存一直都不会生效,请求都会打到数据库上 解决:

  • 缓存空对象(让redis抗下压力,可能造成短期的不一致,但实现简单),或者在空对象上设置TTL
  • 布隆过滤器(内存占用小,没有冗余的key,可能会误判)。bloomfilter 就类似于一个 hash set,用于快速判某个元素是否存在于集合中,其典型的应用场景就是快速判断一个 key 是否存在于某容器,不存在就直接返回。布隆过滤器的关键就在于 hash 算法和容器大小

image.png

image.png