一架梯子,一头程序猿,仰望星空!
Redis面试题 > 内容正文

Redis的缓存穿透、缓存雪崩和缓存击穿是什么?如何避免?


问题简答

1、缓存穿透:指查询一个一定不存在的数据,由于缓存不命中,会导致每次都要去数据库查询,增加数据库的压力,进而导致系统崩溃。
2、缓存雪崩:指缓存中大量的数据在同一时间失效,导致大量的请求全部打到数据库上,增加数据库的压力,进而导致系统崩溃。
3、缓存击穿:指一个热点key失效或过期时,同时又有大量请求访问这个热点key,导致所有请求都直接打到数据库上,增加了数据库的负载。

问题详解:

缓存穿透

例子:
假设一个电商网站的商品详情页需要通过商品ID查询商品信息,攻击者可以构造不存在的商品ID进行恶意请求,导致缓存中无法命中该商品信息,每次请求都要访问数据库,造成数据库压力过大,甚至可能导致数据库崩溃。

示意图:

解决方案:
使用Bloom Filter来判断请求的数据是否存在,也可以在缓存中加入空对象标记,总之就是避免直接访问数据库。

缓存雪崩

缓存雪崩原因

1. 缓存数据失效时间设置不当

如果所有的缓存数据同时过期,就会导致大量的请求直接落到数据库上,从而引起雪崩。

2. 缓存服务器宕机

如果缓存服务器宕机,而且没有配置高可用的机制,那么所有的请求都会直接落到数据库上,导致数据库压力骤增,从而引起雪崩。

缓存雪崩解决建议

  1. 设置合理的缓存过期时间,避免所有的缓存数据同时失效。
  2. 配置 Redis 集群,采用主从复制、哨兵、集群等机制,提高 Redis 的可用性。

缓存击穿

缓存击穿原因

1.热点数据

某些热点数据(如热门商品、热门新闻等)在某一时刻会被大量并发请求,如果缓存中没有这些数据,每个请求都会访问数据库,导致缓存击穿。

2.缓存过期时间过短

缓存中数据的过期时间设置过短,当数据过期后,大量请求同时访问缓存时,缓存中的数据已经失效,每个请求都会访问数据库,导致缓存击穿。

缓存击穿解决建议

1.设置热点数据永远不过期

将热点数据缓存设置为永久有效,可以避免缓存击穿问题。不过这种方式会导致占用内存较多,需要根据实际情况进行权衡。

2.采用分布式锁机制

在缓存未命中时,先获取分布式锁,然后再从数据库中获取数据,获取到数据后写入缓存,并释放锁。这样可以避免多个请求同时从数据库中获取数据,避免数据库压力过大。

3.使用布隆过滤器

布隆过滤器可以快速判断一个key是否存在于缓存中,如果不存在,则可以直接返回不命中,避免访问数据库。不过布隆过滤器可能会存在一定的误判率,需要根据实际情况进行权衡。

4.使用Redis集群

为避免Redis单点故障和单节点吞吐量不足问题,可以部署Redis集群提高Redis的可用性和吞吐量。