Redis缓存三大坑:穿透、击穿、雪崩,一次讲透

简介: 缓存穿透、击穿、雪崩,名字像兄弟但成因解法完全不同。本文深入讲解三种问题的原理、实现细节与隐藏的坑,覆盖布隆过滤器、互斥锁、逻辑过期、过期随机化等解法。

大家好,我是小耶,写功课只是为了我踩过的坑,你们别再踩了!


缓存是扛高并发的利器,但缓存不是"上了就稳了"。用不好,三个经典问题轮流轰炸你:穿透、击穿、雪崩

这仨名字听着像兄弟,但成因、危害、解法完全不同,甚至解法之间还有互相踩坑的地方。今天往深里讲。


一、缓存穿透:查一个根本不存在的东西

场景:用户查一个 id=99999 的商品,这个 id 数据库里根本没有。缓存里自然也没有,于是每次请求都"穿透"缓存,直接打到数据库。数据库查了一圈,返回空。

危害:正常的空查询本身不致命,但攻击者会利用这一点——用大量不存在的 id 疯狂请求,每次请求都绕过缓存直达数据库,直接把数据库打挂。

解法一:布隆过滤器

在缓存前面加一层过滤器,快速判断"这个 key 一定不存在"。

布隆过滤器的原理是一个 bit 数组 + 多个 hash 函数。写入时,对 key 做 k 次 hash,把对应位置的 bit 置 1;查询时,只要有一个位置是 0,就说明这个 key 一定不存在。

它的特性是:"不存在"是确定的,"存在"可能误判。所以它天然适合拦截非法 id——宁可偶尔放过一个不存在的 id 去打数据库,也不能误杀正常请求。

两个关键参数要算对:

  • bit 数组大小 m:根据预估数据量 n 和目标误判率 p,公式是 m = -n * ln(p) / (ln2)^2
  • hash 函数个数 kk = m/n * ln2

举个例子:预估 1000 万个 key,误判率控制在 1%,bit 数组大约需要 9.6MB,hash 函数取 7 个。参数没算对,要么误判率飙升,要么内存浪费。

工程上直接用 Guava 的 BloomFilter 或 Redisson 的 RBloomFilter,别自己手写 hash。

解法二:缓存空值

查不到也往缓存里塞一个 null,设个短过期时间(比如 60 秒)。下次同样的请求直接命中缓存的 null,不再打数据库。

这里有个隐蔽的坑:如果攻击者用海量不同的非法 id,每个 id 都缓存一个 null,会把缓存内存塞满。所以空值的过期时间一定要短,而且要限制数量。

解法三:参数校验

明显非法的请求(id 为负数、超范围、格式不对)在入口直接拦截。这层是成本最低的防御,但只能挡住"一眼假"的请求,挡不住"看起来合法但不存在"的 id。

三个解法不是三选一,而是分层配合:参数校验挡最外层,布隆过滤器挡中间层,缓存空值兜底。


二、缓存击穿:热点 key 过期的瞬间

场景:某个热点 key(比如秒杀商品的库存、首页的热门内容)在过期的一瞬间,大量请求同时涌进来,发现缓存没了,全部打到数据库。数据库瞬间被压垮。

和穿透的区别:穿透是"查不存在的数据",击穿是"查存在但刚好过期了的热点数据"。

解法一:互斥锁(Mutex)

缓存未命中时,只有一个请求能拿到锁去数据库查询并重建缓存,其他请求等待。

这里最容易写错的是忘了双重检查。正确的流程是:

1. 查缓存,命中 → 直接返回
2. 未命中 → 尝试获取锁
3. 拿到锁 → 再查一次缓存(可能别的线程已经重建好了)
4. 还是没有 → 查数据库 → 写缓存 → 释放锁
5. 没拿到锁 → sleep 重试,回到第 1 步

第 3 步的"再查一次缓存"是关键,省掉它,高并发下会重复查库。锁的粒度也要小,用分布式锁(Redisson)时要注意锁的过期时间设短一点,防止线程挂掉后锁不释放。

解法二:逻辑过期

给热点 key 不设 Redis 的物理过期时间,而是在 value 里存一个"逻辑过期时间戳",比如 {data: "...", expireAt: 1712345678}

读取时判断时间戳,没过期直接返回;发现过期了,先返回旧值(保证用户体验),同时启动一个后台线程去查数据库更新缓存。核心思想是"先返回、后更新",不让用户在缓存重建期间等待。

逻辑过期适合"热点明确、能容忍短暂旧数据"的场景,比如首页 banner、排行榜。

解法三:提前预热

在热点 key 过期前主动刷新。可以在代码里做定时任务,或者在 key 快过期时触发异步刷新。预热解决的是"过期瞬间"的问题,但前提是你知道哪些 key 是热点。


三、缓存雪崩:大量 key 同时失效

场景:两种典型情况——要么是大量 key 在同一时间过期,要么是 Redis 直接宕机。无论哪种,一瞬间所有请求都打到数据库。

危害:这是三个问题里最严重的,击穿是"一个点",雪崩是"一整片"。

解法一:过期时间加随机值

别让所有 key 在同一时刻过期。给每个 key 的过期时间加一个随机偏移,比如基础 5 分钟 + 随机 0-300 秒,把过期时间打散到 5-10 分钟之间。

这是成本最低、收益最高的一招,很多雪崩就死在"所有 key 用同一个过期时间"。

解法二:多级缓存

本地缓存(Caffeine)+ Redis 两级。Redis 挂了,本地缓存还能顶一阵,给恢复争取时间。

但要注意两级缓存的失效顺序:更新数据时,先更新 Redis,再更新本地缓存;本地缓存的过期时间要短于 Redis,避免本地缓存里的旧数据活太久。

解法三:Redis 高可用

单点 Redis 是雪崩的最大诱因。方案有两个层次:

  • 主从 + 哨兵:主节点挂了,哨兵自动把从节点提升为主,秒级切换
  • Redis Cluster:数据分片到多个节点,单个节点挂掉只影响一部分数据,配合副本还能继续服务

能上 Cluster 就别只用主从,主从切换期间的短暂不可用,在极端流量下也可能引发雪崩。

解法四:限流降级

数据库入口做限流,超过阈值直接熔断。宁可部分用户看到降级提示,也不要让全库被压垮。Sentinel 或 Hystrix 都能做。


四、三兄弟对比表

问题 成因 关键特征 核心解法
穿透 查不存在的数据 每次都打到 DB 布隆过滤器 / 缓存空值 / 参数校验
击穿 热点 key 过期瞬间 单点瞬间流量洪峰 互斥锁 / 逻辑过期 / 预热
雪崩 大量 key 同时失效 / Redis 宕机 整片缓存失效 过期随机化 / 多级缓存 / 高可用 / 限流

五、一个真实的生产事故

曾经有个电商系统,首页 banner 的缓存过期时间统一设成了 2 小时。运维在凌晨统一上线,结果凌晨 2 点整,所有 banner 缓存同时过期,流量全部打到数据库。数据库连接池瞬间打满,整个首页白屏。

最后只改了一件事:给每个 key 的过期时间加随机偏移。一行代码,问题彻底消失。

缓存问题往往不是技术多难,而是没想到那个"同时"。


缓存是放大器——用对了放大性能,用错了放大故障。穿透、击穿、雪崩的区别和解法,加上每一招背后的实现细节和隐藏的坑,是用好 Redis 的必修课。别等数据库被打挂了才想起来补。

小耶在手,SQL不愁。

还有什么想了解的,欢迎留言!小耶一定知无不言言无不尽……我们下次见~

相关文章
|
8天前
|
存储 弹性计算 缓存
阿里云服务器租赁费用:新版租赁收费标准及活动报价参考
本文更新了2026年阿里云全系列云服务器租赁活动报价,所有特惠资源均可前往阿里云活动中心选购,整体覆盖从个人入门到企业级高性能场景的全梯度需求。其中轻量应用服务器主打极致性价比,2核2G峰值200M带宽配置每日10点、15点限时抢购价仅38元/年,2核4G配置379元/年起;高性价比的经济型e实例、通用算力型u2i实例覆盖2核4G至4核32G全档位,适配开发测试与中小型企业业务;搭载英特尔至强6处理器的第九代c9i企业级实例算力较上代提升20%,支撑高并发生产环境,不同实例规格价差清晰,用户可根据自身业务负载与预算灵活选型。
1813 118
阿里云服务器租赁费用:新版租赁收费标准及活动报价参考
|
9天前
|
人工智能 程序员 API
Codex 接入 DeepSeek-V4-Flash:还能补上识图,提供两套方案
Codex 接入 DeepSeek-V4-Flash 怎么配?本文覆盖 CLI 与桌面端,再用 qwen3-vl-flash 补识图,两套方案可直接照做
1370 11
|
15天前
|
云安全 人工智能 运维
阿里云联动百位企业安全专家,共识Agent防御最佳实践
当Agent成为新员工,你的安全边界在哪里?
1962 9
阿里云联动百位企业安全专家,共识Agent防御最佳实践
|
9天前
|
编解码 人工智能 安全
2核4G/4核8G/8核16G阿里云服务器如何选择实例?经济型e、通用算力型u2i与计算型c9i选哪个?
本文介绍了阿里云2核4G、4核8G、8核16G三档主流配置下经济型e、通用算力型u2i和计算型c9i三种实例的最新活动价格与适用场景。同配置下三者价差显著,以2核4G为例,经济型e低至599.93元/年,计算型c9i则高达1742.08元/年。文章详细解析了各实例的性能定位:经济型e适合轻负载入门场景,u2i兼顾稳定算力与性价比,c9i凭借第9代至强处理器与芯片级安全能力支撑高性能业务。同时提示用户可叠加满减优惠券享受折上折,建议根据业务负载与预算综合决策。
549 113
|
6天前
|
编解码 弹性计算 云计算
MiniMax-H3 视频生成模型 — 一键部署与使用指南
MiniMax-H3是MiniMax开源的33B全模态视频生成模型,支持文生视频、图生视频、参考生视频三种模式,原生输出2K/15秒带立体声音频视频,已原生适配ComfyUI,并可通过阿里云计算巢一键部署。(239字)
|
21天前
|
人工智能 前端开发 Linux
Codex 桌面版安装 + CC Switch 接入第三方 API 完整教程(2026 最新)
2026最新教程:手把手教你安装Codex桌面版,通过CC Switch v3.17.0一键接入Fenno等国产API(兼容OpenAI Responses格式),跳过账号登录,完整启用代码审查、多步任务与上下文感知功能。零基础友好,全程图文实操。(239字)
3206 5
|
9天前
|
人工智能 JSON Shell
2026AI漫剧本地全开源方案(附各个软件模型链接),8G显卡也能流畅运行
这是一套完全本地化部署的AI漫剧生成技术链路:涵盖LLM剧本分镜生成、FLUX文生图(IP-Adapter人脸锁定)、StoryDiffusion时序连贯控制、LTX-2.3唇形同步视频生成,及ComfyUI全流程调度。零云端费用,仅耗硬件算力,单集2–4小时可产出竖屏短视频,适配抖音/B站分发。
|
7天前
|
人工智能 API 开发工具
2026 零基础本地 AI 漫剧完整实操教程(8G 笔记本显卡可用|附可直接复制命令与代码)
本方案提供完全离线、本地运行的漫剧全自动制作流程:RTX3060/4050 8G显卡即可驱动,涵盖Qwen写分镜→ComfyUI统一角色绘图→LTX2.3图生微动画→Qwen3-TTS本地配音→FFmpeg自动合成,全程无水印、免API、不限次。专为低显存优化,解决变脸、闪烁、爆内存三大痛点。(239字)

热门文章

最新文章