Redis缓存雪崩、缓存穿透、缓存击穿

2022-10-15,,,,

缓存雪崩

Redis中的缓存数据是有过期时间的,当在同一时间大量的缓存同时失效时就会造成缓存雪崩。

解决方案

1、设置Redis中的key永不过期,缺点是会占用很多内存

2、使用Redis的分布式锁SETNX。由于查询的是同一个key,那让同一时间只有一个请求落到MySQL上,其余的都去查缓存的数据。

缓存穿透

在Redis缓存和数据库中都找不到相关的数据。如果有大量非法请求,如id为负数的请求,导致每次这个请求都要去缓存与数据库查,造成数据库被压垮。

解决方案

1、过滤非法查询,如id小于0或分页内容过大等

2、缓存空数据。如果查询是合法的,但缓存与数据库中都没有,那就在Redis中缓存一个空对象,但问题在于,如果客户端一直发送这种恶意请求,就会一直在缓存中建立空对象,浪费很多空间。

3、使用布隆过滤器。虽然布隆过滤器会存在误判,但可以设置一个可以接受的误差值。

缓存击穿

缓存击穿和缓存雪崩类似,也是因为Redis中key过期导致的。只不过缓存击穿是某一个热点的key过期导致的。比如在秒杀场景中,如果一个秒杀商品的key突然过期,那此时的超高并发量就直接打到了数据库上,造成数据库被压垮。

解决方案

1、设置热点key永不过期

2、使用Redis的分布式锁,与缓存雪崩很像,区别在于缓存雪崩是某一时刻大批key失效,而缓存击穿是一直有大量的请求访问热点key,就像是许多子弹打到盾牌的同一个点上,最终击穿了这面盾牌。那我就加上限制,让同一时间只能有一个请求落到数据库上,因为查询的都是同样的信息。

Redis缓存雪崩、缓存穿透、缓存击穿的相关教程结束。

《Redis缓存雪崩、缓存穿透、缓存击穿.doc》

下载本文的Word格式文档,以方便收藏与打印。