Redis面试题-缓存雪崩、缓存穿透、缓存击穿问题

1 穿透: 两边都不存在(皇帝的新装) (黑名单) (布隆过滤器)

2 穿:一个热点的key失效了,这时大量的并发请求直接到达数据库. (提前预热

3 雪崩:大量key同时失效 (避免大量的key同一时间失效,错峰

1. 缓存雪崩

问题描述: 缓存雪崩是指在某个时间段内,大量缓存集中过期失效,进而导致大量请求直接落到了数据库上,数据库瞬间压力剧增,可能导致数据库崩溃。比如,如果多个缓存数据设置了相同的过期时间,在过期那一刻,原本由缓存支撑的请求都转到了数据库,形成了流量“雪崩”。

解决办法

雪崩:错峰处理

将redis内的数据设置一个时间段内随机失效时间

  • 随机过期时间:为每个缓存项的过期时间增加一个随机范围,避免同一时刻大量缓存同时失效。
  • 分层缓存:采用二级缓存策略,一级缓存失效后,立即尝试从二级缓存获取,减轻数据库压力。
  • 设置热点数据永不过期或延长过期时间:对于访问非常频繁的热点数据,可以考虑设置永不过期或采取更长的有效期策略。
  • 后台异步刷新:在缓存即将过期前,后台异步更新缓存,而不是等到用户请求触发时再实时更新。
  • 限流、熔断、降级:在系统设计时加入限流措施,当请求过多时进行熔断或服务降级,减少对数据库的影响。
  • 集群化和数据分片:通过集群化部署,让缓存分散在多个节点上,减小单点失效的风险。

3. 缓存击穿

问题描述: 缓存击穿特指某个热点Key在缓存过期的瞬间,大量并发请求恰好同时到达,请求直通数据库,导致数据库瞬时压力激增。

解决办法

提前预热(调用)

解决办法:在大量访问请求前提前调用一次接口,刷新失效时间

  • 互斥锁(Mutex Lock):在缓存失效时,不是立即去数据库查询,而是先尝试获得锁,只有拿到锁的请求才能访问数据库,其他请求等待锁释放后再次尝试。
  • 延时双删策略:在缓存失效时,先删除缓存,然后异步去数据库查询最新数据,成功后再次放入缓存;并且设置一个短时间的延迟,在这个延迟期内如果有新的请求过来,还可以继续依赖已删除的缓存。
  • 热点数据永不过期:对于非常重要的热点数据,可以考虑将其设置为永不过期,然后通过后台定时任务或者其他机制定期更新缓存。

 

2. 缓存穿透

问题描述: 缓存穿透是指查询一个根本不存在的数据,缓存和数据库中都没有该数据,但客户端仍持续发起请求,导致每次请求都直接打到数据库上,无法利用缓存减轻数据库的压力,而且如果是恶意攻击,可能引发严重的性能问题。

解决办法

(黑名单) (布隆过滤器):将数据库中也没有的数据放入黑名单,查询时先去redis查询,然后查询redis黑名单,然后再去查询数据库。

  • 缓存空值:对于查询结果为null的数据,也在缓存中存储一份,设定较短的有效期。
  • 布隆过滤器:使用布隆过滤器提前拦截那些一定不存在的数据请求,避免请求到达数据库。
  • 前端校验:对于请求参数进行合法性和合理性校验,减少无效请求进入后端。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值