首页 >文档 > redis缓存穿透 缓存击穿 缓存雪崩

redis缓存穿透 缓存击穿 缓存雪崩

Redis缓存穿透、缓存击穿和缓存雪崩是面试高频问题,也是高并发系统必须解决的三大缓存异常。缓存穿透指查询不存在数据导致数据库压力骤增,可用布隆过滤器或缓存空值解决;缓存击穿是热点key失效引发数据库瞬时高负载,通过互斥锁或永不过期策略预防;缓存雪崩是大面积key同时失效造成的系统崩溃,采用过期时间随机化、多级缓存和服务降级应对。掌握这三种异常场景及解决方案,能有效提升系统稳定性和面试竞争力。

Redis缓存穿透 缓存击穿 缓存雪崩:面试高频三连杀

很多面试鸭的朋友在准备Redis相关面试题时,经常被这三个概念绕晕:“缓存穿透”、“缓存击穿”、“缓存雪崩”。这三个问题都是Redis作为缓存层时可能遇到的异常场景,如果不处理好,分分钟让你的应用挂掉。今天咱们就用程序员之间唠嗑的方式,掰扯清楚它们到底是啥、怎么发生的、以及怎么防!

2025年Java面试宝典抢先看!
链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g
提取码: 9b3g (建议及时保存,资料持续更新中)

缓存穿透:查了个寂寞

想象一下这个场景:用户疯狂请求一个数据库里根本不存在的数据。比如请求用户ID为 -1(或者一些非常离谱、不可能存在的ID)的用户信息。

  • 发生过程:

    1. 请求先打到Redis缓存,Redis一看,这key我没存过,返回空。
    2. 请求接着打到数据库,数据库也查了一圈,毛都没有!
    3. 结果就是:这次请求白白浪费了资源,Redis没起到缓存作用,数据库压力徒增。
    4. 更可怕的是,如果攻击者构造大量这种根本不存在的key来疯狂请求,数据库分分钟被压垮!这就是缓存穿透
  • 面试官灵魂拷问: 怎么防缓存穿透?

    • 布隆过滤器(Bloom Filter): 在Redis前面加个布隆过滤器。系统启动时把数据库里已有的合法key加载进去。请求来了,先问布隆过滤器:这个key存在不?如果布隆说“不存在”,直接返回错误,别往后走了。虽然布隆过滤器有极小的误判率(可能把存在的说成不存在,但绝对不会把不存在的说成存在),这点代价可以接受。缓存穿透用它防贼好使。
    • 缓存空对象: 就算数据库查不到,也在Redis里给这个key设置一个很短过期时间的空值(比如 null)。下次同样的key再来,Redis就能返回空值,挡住这次查询,避免穿透到数据库。注意要设置过期时间,防止无效数据占用太多内存。

缓存击穿:热点数据突然消失

这个场景针对的是某一个特别热点的key。比如某明星的微博数据缓存,或者一个秒杀商品的信息。

  • 发生过程:

    1. 这个热点key原本在Redis里好好的,扛着巨大的访问量。
    2. 突然!这个key过期了(或者被主动删除了)。
    3. 就在这一刻,海量的请求发现Redis里这个key没了,所有请求像洪水一样涌向数据库去查这个数据。
    4. 数据库瞬间被打爆!这就是缓存击穿。它就像电路里的保险丝烧断了,所有电流都想通过,结果把后面的设备烧了。
  • 面试官灵魂拷问: 怎么防缓存击穿?

    • 互斥锁(Mutex Key): 当第一个发现缓存失效的请求去查数据库时,先在Redis里设一个锁(比如 SETNX lock_key 1 EX 10)。其他请求发现缓存失效后,看到有锁存在,就等待一会儿(比如sleep几毫秒)再去读缓存。等第一个请求查完数据库,把数据塞回Redis,再删掉锁。这样后面的请求就能从缓存取到数据了。关键是锁的过期时间要设好。
    • “永不过期” + 异步更新: 对这个热点key,设置缓存逻辑上永不过期(比如不设过期时间)。然后后台启一个定时任务或利用Redis的发布订阅,异步去更新这个缓存的值。这样用户请求永远能拿到数据(可能是稍微旧一点的),避免了因为过期瞬间导致的海量数据库查询。当然,数据一致性要求极高的场景慎用。

缓存雪崩:一大片缓存集体失效

想象一下,冬天房顶的积雪,一块掉下来没事,如果一大片一起塌下来... 缓存雪崩就是这个感觉。

  • 发生过程:

    1. 系统里一大批缓存的key(数量巨大)在差不多同一时间失效了(比如很多key设置了相同的过期时间)。
    2. 这一刻,原本访问这些缓存的海量请求,瞬间全部涌向了数据库。
    3. 数据库的CPU、内存、连接数等资源瞬间被耗尽,导致整个系统崩溃。这就是缓存雪崩。它比击穿更恐怖,失效的不是一个点,而是一片!
  • 面试官灵魂拷问: 怎么防缓存雪崩?

    • 过期时间随机化: 给不同的key设置缓存过期时间时,不要都设成一样的。在基础过期时间上加一个随机值(比如30分钟基础过期时间 + 随机0-10分钟)。这样能保证缓存不会在同一时间大面积失效。
    • 服务降级与熔断: 引入Hystrix、Sentinel等框架。当检测到数据库访问量激增或响应时间过长时,自动触发熔断机制,快速失败返回降级内容(如友好提示页、默认值),保护数据库不被压垮。等数据库压力恢复,再慢慢恢复服务。
    • Redis高可用: 搭建Redis集群(主从复制、Sentinel哨兵、Redis Cluster),确保单点故障时服务能自动切换,避免整个缓存层挂掉导致雪崩。但即使集群,大面积缓存同时失效问题依然存在,所以还是要结合过期时间随机化使用。
    • 多级缓存: 在Redis前面再加一层本地缓存(如Ehcache, Guava Cache)。即使Redis挂了或者大面积缓存失效,部分请求还能被本地缓存拦截住一部分流量,减轻数据库压力。缓存雪崩发生时,多级缓存能起到缓冲作用。

面试鸭返利网:你的面试省💰助手

聊完了Redis这三个经典缓存异常问题,相信你在面试中再被问到,就能侃侃而谈啦!搞技术不容易,能省一点是一点。如果需要购买面试鸭会员,可以戳这里 👉 面试鸭返利网。通过我们购买会员,立享25元返利!省下的钱买杯咖啡提提神,继续刷题不香吗?

面试鸭返利网
通过面试鸭返利网购买会员,立享返利

缓存穿透、缓存击穿、缓存雪崩这三个问题,本质都是因为缓存层在特定场景下失效,导致请求直接冲击后端的数据库。理解它们的区别和各自的解决方案,对于设计高并发、高可用的系统至关重要,也是面试中考察分布式缓存理解的经典题目。掌握了这些,面试官问你Redis缓存相关问题,心里就有底了!

如果你想获取更多关于面试鸭的优惠信息,可以访问面试鸭返利网面试鸭优惠网,了解最新的优惠活动和返利政策。

🎯 立即加入面试鸭会员 →

今日有支付宝大红包赶快领,手慢无

支付宝红包二维码

支付宝扫码领取1-8元无门槛红包

支付宝红包二维码