Redis缓存穿透、击穿与雪崩

概念

  • 穿透:查询缓存与数据库中都没有的数据;很多用户同事访问这些数据,就会对DB造成较大压力
  • 击穿:热点Key失效的瞬间,请求击穿缓存到DB
  • 雪崩:缓存层出现错误不能工作,请求大量到DB,甚至导致DB挂掉;存储层的调用量会暴增,造成存储层也会挂掉的情况

解决方案

穿透

  1. bool过滤器
    首先也是对所有可能查询的参数以hash形式存储,当用户想要查询的时候,使用布隆过滤器发现不在集合中,就直接丢弃,不再对持久层查询。
  2. 缓存空对象
    查询没有结果的数据,也进行缓存。
    可能会有以下问题
    a. 浪费空间
    b. 空值会过期

击穿

  1. 限流降级(使用互斥锁)
    缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
  2. 多级缓存
    对热点数据设置两级甚至以上缓存,失效时间依次递增,优先使用第一级。第一级失效时查询第二级。可以配合限流降级使用。

雪崩

  1. redis高可用
    集群搭建
  2. 限流降级
    在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
  3. 数据预热
    在正式部署之前,我先把可能的数据先预先访问一遍,这样部分可能大量访问的数据就会加载到缓存中。在即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。

你可能感兴趣的:(Redis缓存穿透、击穿与雪崩)