什么是Redis缓存雪崩、缓存穿透和缓存击穿?

兄弟们,我想请教下,什么是Redis缓存雪崩、缓存穿透和缓存击穿?
最新回答
姐の霸气

2026-10-19 10:40:33

Redis缓存雪崩、缓存穿透和缓存击穿的定义及解释如下:

1. 缓存雪崩

  • 定义:缓存雪崩是指大量的缓存key在同一时间大量的失效,导致所有的请求都打到数据库上,造成数据库响应不及时而挂掉的现象。
  • 示例:在双十一期间,由于首页的访问量非常大,首页的很多数据被缓存在Redis中。假设首页数据存储在Redis里的100个key,设置的缓存失效时间是两个小时。当购物超过两个小时之后,首页数据的Redis缓存在瞬间全部失效,导致所有的请求都打到MySQL数据库上,此时数据库的访问压力增大,可能造成数据库响应不及时而挂掉。
  • 解决方案:

    设置缓存的失效时间时,将key的失效时间分散开,避免大量key在同一时间失效。

    集群部署Redis,将热点的key放到不同的节点上,均匀分布热点key的访问压力。

    不设置缓存失效时间,让key永不失效(但需注意内存占用问题)。

2. 缓存穿透

  • 定义:缓存穿透是指缓存和数据库中都没有这样的数据,导致请求直接穿透缓存层打到数据库上。一般出现这种情况都不是正常的用户在访问。
  • 示例:某个网站受到了黑客的攻击,黑客利用数据库主键没有负数这一点,不断用ID小于零的参数发请求。由于Redis缓存中没有ID小于零的数据,这些请求都会直接打到数据库上,造成数据库压力增大。
  • 解决方案:

    如果请求穿透Redis直接打到数据库,无论数据库查出什么结果,都写回到Redis缓存中,以便下次请求时能被缓存拦截。

    对请求的参数做合法性校验,避免非法参数导致的缓存穿透。

    将恶意请求的IP拉黑。

    使用布隆过滤器来过滤掉不存在的数据请求。

3. 缓存击穿

  • 定义:缓存击穿是指某个非常热点的key,在大量的用户请求下,这个key突然失效,导致这些请求都打到数据库上。
  • 示例:在双十一期间,某个热门商品被大量用户关注并请求。该商品的数据被缓存在Redis中,但缓存的失效时间设置得较短。当大量用户请求该商品时,Redis中的缓存突然失效,导致这些请求都打到数据库上,造成数据库压力增大。
  • 解决方案:

    让这个热点key不过期,即不设置失效时间(但需注意内存占用和热点数据更新问题)。

    使用分布式锁或互斥锁来确保在缓存失效时只有一个请求能够打到数据库上,其他请求则等待缓存更新后再访问。

总结:

  • 缓存雪崩:大量缓存key在同一时间失效,导致数据库压力增大。
  • 缓存穿透:缓存和数据库中都没有的数据请求,导致请求直接打到数据库上。
  • 缓存击穿:某个热点key在大量请求下突然失效,导致这些请求都打到数据库上。

以下是相关示意图:

  • 缓存雪崩示意图:

  • 缓存穿透示意图:

  • 缓存击穿示意图:

这些示意图直观地展示了缓存雪崩、缓存穿透和缓存击穿的现象及其影响。