Redis 缓存雪崩、击穿、穿透

1,188 阅读2分钟

1、Redis 缓存雪崩

一句话就是:大面积的缓存失效,Redis 相当于没有了,直接将查询请求打到数据库,然后数据库顶不住,崩了。

image-20200823095731088

例如:设置缓存更新时间为12:00, 但恰好有秒杀、促销活动,一下涌进很多的请求,本来 Redis 还可以抗住,但因为此时缓存失效了,所以直接打到数据库,但数据扛不住这么多的请求,然后崩了。

解决方法:缓存失效时间可以设置为凌晨三四点钟这段流量比较少的时候,另外 Redis 缓存失效时间加个随机值,避免同一时间大面积的缓存失效。

2、缓存击穿(数据存在的)、穿透(请求不存在的数据)

缓存击穿、穿透是两个比较容易混淆的概念,还是一句话概括:

  • 缓存击穿是一个非常热点的数据(该数据是存在的),然而在请求量很大的时候突然失效了,也是直接将请求打到了数据库。跟缓存雪崩不同的是,击穿是小部分缓存失效,雪崩是大部分缓存失效
  • 缓存穿透是一直请求数据不存在的数据,所以 Redis 没有该数据的缓存,也是直接将请求打到了数据库。

解决方法:

  • 缓存击穿可以设置热点数据永不过期,例如商城首页、某个热门活动,更新的时候选择流量比较少的时间,更新完立马刷新缓存。
  • 缓存穿透:
    • 1、请求的参数检验,不合法的数据直接返回错误
    • 2、布隆过滤器,布隆过滤器的特点,说不存在的数据的一定不存在,过滤不存在的数据请求
    • 3、拉黑恶意请求,配置每秒超过多少次的,一看就不是人手工操作发起的请求的 IP 直接拉黑