Redis缓存穿透和雪崩

suaxi
2021-01-03 / 0 评论 / 269 阅读 / 正在检测是否收录...

Redis缓存穿透和雪崩

缓存穿透

1、概念

当用户查询一个数据时,发现redis内存数据库中没有(缓存未命中),于是向持久层数据库(如MySQL)查询,发现也没有要查询数据,造成本次查询请求失败。当用户很多时,出现了同样的情况,就会给持久层数据库造成很大的压力,这个过程就称为缓存穿透

解决方案

布隆过滤器:它是一种数据结构,对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合则丢弃,从而避免对底层数据库的查询压力。

布隆过滤器.png


缓存空对象:当存储层不命中后,将返回的空对象也存储起来,同时设置一个过期时间,之后有请求访问这个数据时从缓存中获取,以此保护后端数据源

缓存空对象.png

存在的问题:

1、存储空对象需要更多的存储空间

2、即使设置了过期时间,缓存层和存储层的数据存在一定时间的窗口期,对数据一致性要求较高的业务可能会出现问题

缓存击穿

1、概念:

当某个key在过期的瞬间,有大量的并发请求访问(这类数据一般是热点数据),由于缓存过期,请求会去访问数据库来进行查询,并且回写缓存,会导致数据库瞬间压力过大,如:微博热搜宕机

解决方案

1、设置热点数据永不过期

2、加互斥锁

使用分布式,保证对于每个key只有一个线程去查询后端服务,其他没有获得分布式锁的线程需要等待



缓存雪崩

1、概念

指在某一个时间段,缓存集中过期,查询请求全部落到后端数据库头上。

例:双11的抢购,将热点商品集中放入缓存,设置过期时间为1点,到了凌晨1点,这批热点商品的缓存都过期了,这时对于这批商品的查询请求会全部落到数据库头上,对于数据库而言产生了周期性的波峰压力,底层存储的调用量指数上升,整个服务极易出现问题。

缓存雪崩.png


解决方案

1、Redis高可用

增加Redis服务器,一台出现问题之后,其他节点正常工作(异地多活)

2、限流降级

在缓存失效后,通过加锁队列来控制读取数据库写缓存的线程数量

3、数据预热

在正式部署之前,把可能的数据先访问一遍,在发生高并发请求之前手动触发缓存key,并设置不同的缓存过期时间,让缓存失效的时间尽量均匀,而不是集中过期

0

评论 (0)

取消