发布时间:2026/8/27 20:34:21
别只会用Redis!搞懂缓存穿透、击穿、雪崩,才算真正掌握高并发架构 大家好我是木泽。你们有没有发现现在互联网系统中Redis 几乎已经成为高并发架构的“标配”。用户登录信息、商品详情、热点新闻、秒杀库存、排行榜数据全都放 Redis。甚至一些复杂计算结果也会提前缓存到 Redis 中。为什么因为数据库扛不住。一次请求直接查询 MySQL客户端请求 | ↓ MySQL | ↓ 返回数据如果用户量从几千增长到几十万每一次请求都访问数据库数据库连接池会迅速耗尽CPU 飙升磁盘 IO 打满最终整个系统瘫痪。于是我们引入缓存客户端请求 | ↓ Redis | ↓ MySQL正常情况下热点数据从 Redis 读取冷门数据查询数据库查询结果重新写入 Redis系统性能提升几十倍甚至几百倍。但是Redis 并不是用了就万事大吉。在真实生产环境中缓存系统经常会遇到三个经典问题缓存穿透缓存击穿缓存雪崩很多面试会问“说说缓存穿透、缓存击穿和缓存雪崩有什么区别”但真正优秀的工程师不只是知道概念。更重要的是为什么会发生会造成什么影响如何设计防护方案哪些方案适合生产环境今天我们一次讲透。一、缓存穿透请求的数据Redis和数据库都没有1. 什么是缓存穿透缓存穿透指的是用户请求的数据在 Redis 不存在同时数据库中也不存在导致请求不断穿过缓存直接访问数据库。看一下流程用户请求 | ↓ Redis查询 | ↓ 不存在 | ↓ 查询MySQL | ↓ 不存在 | ↓ 返回空结果问题在哪里如果这是一次正常请求没有任何问题。但是如果有人恶意构造大量不存在的数据例如GET /user?id-10001 GET /user?id999999999 GET /user?idabcxxxRedis没有。MySQL没有。于是每一次请求都会打到数据库。大量无效请求最终可能导致数据库 CPU 升高数据库连接耗尽正常用户请求变慢服务整体不可用2. 一个真实业务场景假设你的系统有商品查询接口GET /product/10086正常情况下Redis 里有product:10086 { name:iPhone, price:6999 }直接返回。但是攻击者GET /product/-1 GET /product/-2 GET /product/-3 ... GET /product/-999999你的代码public Product getProduct(Long id){ Product product redis.get(product: id); if(product ! null){ return product; } product mysql.query(id); return product; }每一次请求Redis 查不到继续查询数据库最终数据库成为压力中心。3. 如何解决缓存穿透方案一缓存空对象这是最简单的方法。如果数据库不存在不要什么都不存而是在 Redis 保存一个空值。例如product:-10001 null代码public Product getProduct(Long id){ String key product: id; Product product redis.get(key); if(product ! null){ return product; } product mysql.query(id); if(product null){ redis.setex(key, 300, null); return null; } redis.setex(key, 3600, product); return product; }这样第一次Redis 不存在 → 查询数据库 → 数据库不存在 → 写入 Redis 空值。第二次Redis 存在 null → 直接返回。优点实现简单效果明显缺点如果恶意请求大量不同 IDRedis 可能存大量无效 key。方案二布隆过滤器布隆过滤器是一种空间效率非常高的数据结构。核心思想是提前判断“这个数据一定不存在吗”例如商品系统上线把所有商品 ID 加入布隆过滤器商品ID 1001 1002 1003 1004请求productId99999时流程请求 ↓ Bloom Filter ↓ 不存在 ↓ 直接返回根本不会访问 Redis 和数据库。Java 示例public Product getProduct(Long id){ if(!bloomFilter.contains(id)){ return null; } Product product redis.get(product: id); if(product ! null){ return product; } return mysql.query(id); }优点节省 Redis 空间防御大量恶意请求缺点存在误判概率。也就是说布隆过滤器可能认为存在但不会认为不存在的数据一定存在。二、缓存击穿一个热点Key突然失效1. 什么是缓存击穿缓存击穿指一个热点数据缓存失效大量请求同时访问数据库。重点缓存击穿针对的是一个热点 Key。例如明星演唱会门票ticket:2026平时 Redis 里剩余 100 张。突然缓存过期瞬间 10 万人同时访问100000请求 | ↓ Redis查询 | ↓ 缓存失效 | ↓ 100000请求访问MySQL数据库瞬间压力暴增。2. 为什么缓存击穿危险因为热点数据访问量巨大。比如一个新闻热搜news:top1访问量 10 万 QPS。如果缓存失效10 万请求同时进入数据库。数据库 500 QPS 还能撑10 万 QPS 直接崩溃。3. 如何解决缓存击穿方案一设置热点Key永不过期对于极热点数据不要设置 TTL。例如hot_news:001永久保存数据更新时主动刷新redis.set(hot_news, newsData);适合热搜首页推荐配置数据方案二互斥锁核心思想只允许一个请求查询数据库。第一个请求Redis 失效 → 获取锁 → 查询数据库 → 写入 Redis → 释放锁。其他请求Redis 失效 → 获取锁失败 → 等待 → 重新查询 Redis。代码public Product getProduct(Long id){ String key product: id; Product product redis.get(key); if(product ! null){ return product; } synchronized(this){ product redis.get(key); if(product ! null){ return product; } product mysql.query(id); redis.setex(key, 3600, product); } return product; }生产环境通常使用Redis 分布式锁Redisson三、缓存雪崩大量缓存同时失效1. 什么是缓存雪崩缓存雪崩大量缓存 Key 在同一时间过期导致大量请求直接访问数据库。例如你的系统凌晨 12 点批量加载缓存所有缓存 12:00 过期商品缓存 12:00过期 订单缓存 12:00过期 用户缓存 12:00过期 首页缓存 12:00过期12 点 01 分大量请求进入Redis 没有数据全部访问 MySQLRedis大量失效 ↓ 请求全部进入数据库 ↓ 数据库压力暴增 ↓ 数据库崩溃 ↓ 整个系统不可用2. 如何解决缓存雪崩方法一随机过期时间不要把过期时间设成全部一致expire3600秒改成expire3600random(300)例如商品 A 3605 秒、商品 B 3710 秒、商品 C 3890 秒让缓存自然分散。Javaint expire 3600 new Random().nextInt(300); redis.setex(key, expire, value);方法二缓存预热系统上线前提前加载热点数据。例如每天凌晨统计热门商品 → 提前查询数据库 → 写入 Redis避免用户第一次访问造成压力。方法三多级缓存大型互联网系统通常不会只依赖 Redis。架构浏览器缓存 ↓ CDN缓存 ↓ 本地缓存 ↓ Redis ↓ MySQL每一级承担压力。四、三者区别总结一句话记忆穿透你查的是不存在的数据。击穿你查的是一个热点数据但它突然没了。雪崩大量数据一起没了。五、真正生产环境应该怎么设计一个成熟的缓存体系不应该只靠 Redis。通常组合请求 ↓ 参数校验 ↓ 布隆过滤器 ↓ Redis缓存 ↓ 分布式锁 ↓ 数据库 ↓ 缓存更新同时热点数据长期缓存普通数据随机 TTL空数据短时间缓存重要接口限流数据库做好保护因为缓存的本质不是简单存数据而是在流量洪峰到来时保护核心系统。六、写在最后Redis 很快但 Redis 解决不了所有问题。真正高并发系统的核心不是“用了 Redis”而是“知道 Redis 什么时候会失效并提前设计防护”。缓存穿透考验的是你能不能挡住无效流量。缓存击穿考验的是你能不能保护热点数据。缓存雪崩考验的是你的系统有没有整体容灾能力。优秀的架构不是在事故发生后修复而是在事故发生之前已经想到它会发生。这才是 Redis 缓存设计真正的价值。既然都看到这了如果喜欢这篇文章随手点个赞、在看、转发三连吧如果想第一时间收到推送也可以给我个星标⭐感谢收看我们下期见。

相关新闻

2026/8/27 20:34:21

电商进销存系统设计:从业务建模到库存流水的高阶实践

前阵子有个做电商运营的朋友找我,说老板让他牵头重做一套进销存系统,需求文档里写了一句“要设计得更高级一点”。他问我:高级到底是多上几个新功能,还是界面做得更漂亮?我说,这两样都不是最关键的。如果你…

2026/8/27 20:29:21

高并发服务的权限边界如何划分

高并发服务的权限边界如何划分权限边界从资产、调用方和失败后果出发设计;接口方便性不能取代最小权限原则。 Go 的 context.Context 用来传递取消、截止时间和请求范围内的值。它不会自动携带 Authorization Header,但项目代码可能把用户 Claims 或其他…

2026/8/27 20:29:21

微服务效果评估不能只听感受

微服务效果评估不能只听感受效果评估应结合可复现指标、对照组和业务反馈,避免把一次观察写成确定结论。 在 Java 微服务中接入 LangChain4j 或 Spring AI 后,人工试问几条问题只能发现明显体验问题,无法说明检索、上下文组装和外部依赖在版本…

2026/8/27 21:04:47

Jetson TX2/Xavier加固电脑Linux系统部署:从刷机到性能调优全指南

前阵子在一个户外项目中折腾 Jetson TX2 和 Xavier 平台的加固电脑,天天泡在刷机、调系统和压测里。这个领域其实很有意思:外人看着就是一台“防尘防水防摔的电脑”,但对搞嵌入式 Linux 的人来说,它是一整套和普通 PC 完全不同的技…

2026/8/27 21:04:47

单片机毕业设计-基于 STM32 的指纹刷卡密码一体化门禁装置开发 基于 STM32 单片机的多模态身份识别门禁系统研究(012505)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/8/27 21:04:47

四通道RF采样收发器详解:架构、指标与工程实践

如果你最近在做雷达接收链路、宽带通信或者软件定义无线电的选型,大概率会被一个词反复刷屏:RF-Sampling Transceiver,射频采样收发器。这类芯片最大的特点就是单颗器件里直接嵌入四个ADC和四个DAC,采样率不是几十Msps&#xff0c…

2026/8/27 21:04:47

单片机毕业设计-基于 STM32 与蓝牙 APP 的智能水族箱综合管控系统设计 基于 STM32 的水体环境监测与自动补水加热控制系统开发(012305)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/8/27 21:04:47

14.4kW大功率母线变换器设计:LLC+矩阵变压器+GaN实战解析

前阵子调试一台14.4kW的隔离母线变换器样机,有一件事让我印象很深:满载跑热平衡的时候,效率数据是漂亮的98.2%,但热像仪上最先报警的既不是GaN功率管,也不是整流桥,而是我本以为很稳的矩阵变压器。那个场景…

2026/8/26 9:13:28

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/27 10:58:22

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/27 7:46:21

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/27 0:01:16

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

1. 项目概述:从零构建一个企业级的AI服务网关 最近在帮一个做内容审核的团队做技术架构升级,他们原来的业务里,每天有几十万张图片和短视频需要过审,最初是接了几个开源的AI模型自己部署,但效果和性能一直不太稳定。后…

2026/8/27 0:01:16

LeetCode Hot100(51-60)算法精解与面试技巧

1. 题目背景与核心价值"hot100(51-60)"这个标题看起来像是某个编程题库或算法练习集中的一组题目编号。在技术社区中,类似命名通常指向LeetCode、牛客网等平台的热门题目集合。作为刷过300题的算法老手,我理解这类题目的核心价值在于&#xff…

2026/8/27 0:01:16

CRC校验实战:从模2除法到HJ212协议排错

1. 为什么一个“校验码”能扛住工业现场90%的数据 corruption? 你有没有遇到过这样的场景:嵌入式设备通过RS-485上传温湿度数据,上位机偶尔收到一帧乱码——温度显示成-273℃,湿度跳到999%,但串口波形看起来完全正常&a…

2026/8/26 19:34:06

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/26 19:17:08

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/26 19:34:05

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…