news 2026/8/29 4:06:36

【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/8/26 16:04:04

使用qthread实现后台数据采集实战

如何用 QThread 打造流畅的后台数据采集系统&#xff1f;实战避坑全解析你有没有遇到过这样的场景&#xff1a;点击“开始采集”按钮后&#xff0c;界面瞬间卡住&#xff0c;鼠标拖不动、按钮点不灵&#xff0c;几秒甚至十几秒后才突然刷新一堆数据——用户以为程序崩溃了&…

作者头像 李华
网站建设 2026/8/21 15:22:10

AI舞蹈动作捕捉:MediaPipe Pose实战教程

AI舞蹈动作捕捉&#xff1a;MediaPipe Pose实战教程 1. 引言&#xff1a;AI人体骨骼关键点检测的现实价值 在虚拟偶像、智能健身、远程教学和AI舞蹈生成等前沿应用中&#xff0c;人体姿态估计&#xff08;Human Pose Estimation&#xff09;正成为核心技术支撑。通过从普通RG…

作者头像 李华
网站建设 2026/8/25 9:12:27

YOLOv8目标检测避坑指南:工业场景常见问题全解

YOLOv8目标检测避坑指南&#xff1a;工业场景常见问题全解 1. 引言&#xff1a;工业级YOLOv8的挑战与价值 在智能制造、智能安防、仓储物流等工业场景中&#xff0c;目标检测模型不仅要“看得准”&#xff0c;更要“跑得稳”。基于Ultralytics YOLOv8构建的“鹰眼目标检测”镜…

作者头像 李华
网站建设 2026/8/26 0:02:54

实测YOLOv8鹰眼检测:无人机巡航电动车违规行为效果惊艳

实测YOLOv8鹰眼检测&#xff1a;无人机巡航电动车违规行为效果惊艳 1. 背景与挑战&#xff1a;电动自行车监管的智能化转型 近年来&#xff0c;电动自行车已成为我国城市和乡村居民出行的重要交通工具。其轻便、灵活、经济的特点使其保有量持续攀升。然而&#xff0c;随之而来…

作者头像 李华
网站建设 2026/8/25 13:17:19

使用NX二次开发构建标准件库:零基础指南

从零打造专属标准件库&#xff1a;NX二次开发实战全解析你是否曾为反复建模一个M8螺栓而感到厌烦&#xff1f;是否遇到过团队中不同工程师画出的“标准件”尺寸不一、命名混乱&#xff0c;导致装配出错、BOM统计困难&#xff1f;在项目周期越来越紧的今天&#xff0c;这些看似微…

作者头像 李华
网站建设 2026/8/28 13:50:46

CH340驱动安装过程中设备管理器异常处理指南

CH340驱动装不上&#xff1f;设备管理器报错终极排查指南 你有没有遇到过这样的场景&#xff1a;手握一块Arduino开发板、STM32下载器或者ESP32模块&#xff0c;信心满满地插上USB线准备烧录程序&#xff0c;结果打开设备管理器一看—— “未知设备”、“代码10错误”、“COM…

作者头像 李华