news 2026/4/23 19:13:48

【Java进阶】缓存界的“三大劫难”:穿透、雪崩、击穿,你真的能防住吗?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Java进阶】缓存界的“三大劫难”:穿透、雪崩、击穿,你真的能防住吗?

🍂枫言枫语:我是予枫,一名行走在 Java 后端与多模态 AI 交叉路口的研二学生。

“予一人以深耕,观万木之成枫。”

在这里,我记录从底层源码到算法前沿的每一次思考。希望能与你一起,在逻辑的丛林中寻找技术的微光。

在分布式系统的江湖里,Redis就像是数据库(MySQL)的“贴身保镖”。保镖在,万事大吉;保镖一旦失灵,成千上万的请求就会像洪水一样涌向数据库,瞬间让系统瘫痪。

今天,我们要聊的就是保镖最头疼的三种情况:穿透、雪崩、击穿。尤其是如何通过布隆过滤器(Bloom Filter)来封锁第一道防线。


一、 缓存穿透 (Cache Penetration) —— “虚假请求的恶意突袭”

1. 什么是穿透?

定义: 缓存穿透是指查询一个根本不存在的数据。

缓存里没有,于是请求去查数据库,结果数据库里也没有。这导致每次针对这个“不存在数据”的请求都会直接打到数据库上。

形象比喻: 骗子不断拨打一个并不存在的分机号,前台(缓存)查无此人,只好次次去办公室(数据库)询问,搞得办公室没法正常办公。

2. 核心大招:布隆过滤器 (Bloom Filter)

面对恶意的穿透攻击,最优雅的解法就是布隆过滤器。

它是如何实现的?

布隆过滤器由一个很长的二进制向量(Bit Array)和一组哈希函数(Hash Functions)组成。

  1. 初始化:当一个数据存入数据库时,用多个哈希函数对该数据进行计算,得到多个位置,并将位数组中对应位置标为1

  2. 查询:当请求到来时,同样经过这几个哈希函数计算。

    • 如果计算出的位置中有一个为 0,那么这个数据一定不存在(直接拦截)。

    • 如果全是 1,说明数据可能存在(放行去查缓存或 DB)。

Java 实现代码示例 (基于 Redisson)

对于 Java 后端开发,我们通常不需要手写哈希算法,利用 Redisson 可以快速实现分布式布隆过滤器:

// 1. 获取布隆过滤器 RBloomFilter<String> bloomFilter = redissonClient.getBloomFilter("userList"); // 2. 初始化:预计存放1亿个元素,容错率为3% bloomFilter.tryInit(100000000L, 0.03); // 3. 将真实存在的数据加入过滤器 bloomFilter.add("YF_666"); // 4. 查询时判断 if (!bloomFilter.contains(userId)) { return "非法请求"; // 直接在 Redis 层面拦截,不惊动数据库 }

注意:布隆过滤器有误判率,但没有“漏判”。它说不存在,就一定不存在。


二、 缓存雪崩 (Cache Avalanche) —— “多米诺骨牌的倒塌”

1. 什么是雪崩?

定义: 在极短时间内,大量的缓存 Key 同时失效,或者 Redis 宕机,导致原本应该访问缓存的请求全部涌向数据库。

形象比喻: 堤坝(缓存)突然崩塌,洪水(请求)瞬间淹没下游的村庄(数据库)。

2. 避坑指南:

  • 给 TTL 加随机值:设置缓存过期时间时,不要都设成 30 分钟,而是30min + Random(1~5min)。避开同一时刻大规模失效。

  • 双层缓存策略:本地缓存(Caffeine/Guava)+ 分布式缓存(Redis)。Redis 挂了,本地缓存还能顶一阵。

  • 服务熔断与降级:数据库压力过大时,直接开启限流,保护核心业务。


三、 缓存击穿 (Cache Breakdown) —— “明星效应的崩塌”

1. 什么是击穿?

定义: 某个极度热点(Hot Key)的 Key,在承受着上万并发的同时,突然过期了。

形象比喻: 全网都在抢某个明星的演唱会门票(热点 Key),结果在抢票瞬间,这张门票的缓存过期了,成千上万的粉丝直接冲向了售票后台数据库。

2. 解决方案:

  • 互斥锁 (Mutex Lock):使用SETNX。当缓存失效时,只有一个线程能拿到锁去查库并更新缓存,其他线程等待或重试。

    // 伪代码 String value = redis.get(key); if (value == null) { if (redis.setnx(lock_key, 1, 30s)) { // 抢锁 value = db.get(key); redis.set(key, value); redis.del(lock_key); } else { Thread.sleep(100); // 没抢到锁,等一会儿再查缓存 return get(key); } }
  • 逻辑过期:缓存不设物理过期时间,而是把“过期时间”写在 Value 里。发现快过期时,后台异步线程去更新,期间旧数据照样返回。适合对一致性要求不那么极端的场景。


总结:保镖手册

问题诱因核心解法
穿透查不存在的数据布隆过滤器 / 缓存空对象
雪崩大量 Key 同时过期 / Redis 挂了过期时间随机化 / 高可用集群
击穿热点 Key 过期互斥锁 (SETNX) / 逻辑不过期

作为研二学生,在构建简历项目(如你的“知光平台”“TeachMaxAI”)时,如果能体现出对这些问题的预防机制(比如在 RAG 检索流程中加入布隆过滤器),绝对会让面试官眼前一亮。

关于作者: 💡予枫,某高校在读研究生,专注于 Java 后端开发与多模态情感计算。💬欢迎点赞、收藏、评论,你的反馈是我持续输出的最大动力!

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:

https://cloud.tencent.com/developer/support-plan?invite_code=9wrxwtlju1l

当前加入还有惊喜相送!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 7:46:10

从图片到统计报告:YOLOv8鹰眼检测全流程体验

从图片到统计报告&#xff1a;YOLOv8鹰眼检测全流程体验 1. 引言&#xff1a;工业级目标检测的“鹰眼”革命 在智能制造、智慧安防、城市治理等场景中&#xff0c;实时、精准、可量化的目标检测能力已成为核心需求。传统人工盘点或低精度模型已无法满足复杂环境下的多目标识别…

作者头像 李华
网站建设 2026/4/23 9:45:47

MediaPipe开源项目维护性分析:长期可用性部署建议

MediaPipe开源项目维护性分析&#xff1a;长期可用性部署建议 1. 引言&#xff1a;AI人体骨骼关键点检测的工程落地挑战 随着计算机视觉技术的发展&#xff0c;人体姿态估计&#xff08;Human Pose Estimation&#xff09;已成为智能健身、动作捕捉、虚拟现实和人机交互等场景…

作者头像 李华
网站建设 2026/4/23 9:45:30

AI动作分析:MediaPipe Pose在体育训练中的应用

AI动作分析&#xff1a;MediaPipe Pose在体育训练中的应用 1. 引言&#xff1a;AI驱动的体育训练新范式 1.1 技术背景与行业痛点 传统体育训练中&#xff0c;动作标准性评估高度依赖教练经验&#xff0c;存在主观性强、反馈延迟、难以量化等问题。尤其在体操、瑜伽、健身等对…

作者头像 李华
网站建设 2026/4/18 9:29:13

AI姿态估计实战:MediaPipe Pose代码示例

AI姿态估计实战&#xff1a;MediaPipe Pose代码示例 1. 引言&#xff1a;AI人体骨骼关键点检测的现实价值 随着计算机视觉技术的快速发展&#xff0c;人体姿态估计&#xff08;Human Pose Estimation&#xff09;已成为智能健身、动作捕捉、虚拟试衣、人机交互等场景的核心支…

作者头像 李华
网站建设 2026/4/23 9:48:40

MediaPipe Pose部署案例:安防异常行为预警系统

MediaPipe Pose部署案例&#xff1a;安防异常行为预警系统 1. 引言&#xff1a;AI人体骨骼关键点检测的现实价值 在智能安防、工业安全监控和公共空间管理中&#xff0c;传统视频监控系统往往依赖人工回溯或简单的运动检测算法&#xff0c;难以对“跌倒”、“攀爬”、“长时间…

作者头像 李华
网站建设 2026/4/23 9:47:54

人体动作分析系统开发:MediaPipe Pose集成指南

人体动作分析系统开发&#xff1a;MediaPipe Pose集成指南 1. 引言&#xff1a;AI 人体骨骼关键点检测的工程价值 随着计算机视觉技术的发展&#xff0c;人体姿态估计&#xff08;Human Pose Estimation&#xff09;已成为智能健身、虚拟试衣、动作捕捉、安防监控等场景的核心…

作者头像 李华