1、Redis 缓存雪崩
一句话就是:大面积的缓存失效,Redis 相当于没有了,直接将查询请求打到数据库,然后数据库顶不住,崩了。
例如:设置缓存更新时间为12:00, 但恰好有秒杀、促销活动,一下涌进很多的请求,本来 Redis 还可以抗住,但因为此时缓存失效了,所以直接打到数据库,但数据扛不住这么多的请求,然后崩了。
解决方法:缓存失效时间可以设置为凌晨三四点钟这段流量比较少的时候,另外 Redis 缓存失效时间加个随机值,避免同一时间大面积的缓存失效。
2、缓存击穿(数据存在的)、穿透(请求不存在的数据)
缓存击穿、穿透是两个比较容易混淆的概念,还是一句话概括:
- 缓存击穿是一个非常热点的数据(该数据是存在的),然而在请求量很大的时候突然失效了,也是直接将请求打到了数据库。跟缓存雪崩不同的是,击穿是小部分缓存失效,雪崩是大部分缓存失效。
- 缓存穿透是一直请求数据不存在的数据,所以 Redis 没有该数据的缓存,也是直接将请求打到了数据库。
解决方法:
- 缓存击穿可以设置热点数据永不过期,例如商城首页、某个热门活动,更新的时候选择流量比较少的时间,更新完立马刷新缓存。
缓存穿透:
- 1、请求的参数检验,不合法的数据直接返回错误
- 2、布隆过滤器,布隆过滤器的特点,说不存在的数据的一定不存在,过滤不存在的数据请求
- 3、拉黑恶意请求,配置每秒超过多少次的,一看就不是人手工操作发起的请求的 IP 直接拉黑