news 2026/6/10 13:06:16

蓝易云 - 如何使用Redis来防止穿透、击穿和雪崩问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
蓝易云 - 如何使用Redis来防止穿透、击穿和雪崩问题

以下内容以企业级系统稳定性治理为目标,围绕 Redis 在高并发场景下对缓存穿透、缓存击穿、缓存雪崩三类核心风险的防控方案进行系统化拆解。内容强调可落地、可复用、可扩展,适用于真实生产环境,而非概念性描述。


一、先把问题说清楚:三类风险的本质差异 🧠

很多系统“抗不住”,并不是 Redis 不行,而是问题类型判断错误,策略选型失误

问题本质对比表(核心认知)

问题类型触发条件直接后果本质风险
缓存穿透查询不存在的数据请求全部落到 DBDB 被无意义请求拖垮
缓存击穿热点 Key 失效瞬间并发请求同时打 DBDB 被瞬时洪峰压垮
缓存雪崩大量 Key 同时失效DB 长时间高压系统级连锁崩溃

一句话总结:
穿透是“查不到”,击穿是“扛不住”,雪崩是“一起死”。


二、Redis 防缓存穿透:先“止血”,再“兜底” 🛡️

1️⃣ 方案一:缓存空对象(最稳妥)

核心思想
当数据库中不存在的数据被访问时,也要明确告诉系统“它不存在”,而不是反复查询。

实现示例(伪代码)
String value = redis.get(key); if (value != null) { return value.equals("NULL") ? null : value; } Object dbData = db.query(key); if (dbData == null) { redis.set(key, "NULL", 60); // 空值缓存 return null; } redis.set(key, dbData, 300); return dbData;
逐行解释说明
  • redis.get(key)
    👉第一道防线,避免不必要的数据库访问

  • "NULL"占位符
    👉 明确告诉系统:该 Key 在 DB 中不存在

  • TTL=60
    👉 空值短生命周期,防止误缓存真实数据

适合:用户 ID、订单号、资源编号等确定性 Key 场景


2️⃣ 方案二:布隆过滤器(高并发利器)

核心思想
在请求进入 Redis 之前,先做一次存在性预判

工作流程(文字版流程图)
请求 → 布隆过滤器 ↓ 不存在 拦截 ↓ 存在 Redis → DB
特点分析表
维度说明
性能O(1),极低内存
准确性可能误判存在,但不会误判不存在
适用黑名单、ID 校验、高并发接口

企业实践中,布隆过滤器 + 空对象缓存是黄金组合。


三、Redis 防缓存击穿:核心是“控并发” ⚙️

关键认知纠偏

击穿不是 Key 失效的问题,而是Key 失效时没有并发治理机制


1️⃣ 方案一:互斥锁(最经典)

实现示例
if (redis.get(key) == null) { if (redis.setnx(lockKey, "1", 10)) { Object data = db.query(key); redis.set(key, data, 300); redis.del(lockKey); return data; } else { Thread.sleep(50); return redis.get(key); } }
详细拆解
  • setnx(lockKey)
    👉只允许一个线程访问 DB

  • 其他线程sleep + 重试
    👉 避免 DB 被并发打穿

  • lockKey TTL
    👉 防止死锁(这是生产级必备)


2️⃣ 方案二:逻辑过期(更高级)

思想升级
Key 不真正过期,而是值中包含过期时间

数据结构示例
{ "data": {...}, "expireTime": 1710000000 }
优势说明
  • 用户请求永远有数据返回

  • 后台线程异步重建缓存

  • 非常适合:首页、配置中心、排行榜


四、Redis 防缓存雪崩:系统级工程问题 🚧

雪崩不是 Redis 的问题,而是架构治理问题


1️⃣ 方案一:TTL 随机化(第一道防线)

int base = 300; int random = new Random().nextInt(60); redis.set(key, value, base + random);
解释说明
  • base
    👉 统一基础过期时间

  • random
    👉 打散失效时间,避免“集体下线”


2️⃣ 方案二:多级缓存(Redis + 本地缓存)

访问顺序
本地缓存 → Redis → 数据库
实战价值
  • Redis 故障 ≠ 系统不可用

  • 明显降低核心链路压力

  • 高可用系统标配


3️⃣ 方案三:限流 + 熔断(兜底策略)

组件作用
限流控制进入 DB 的请求速率
熔断Redis 异常时快速失败
降级返回默认值或静态页

记住一句话:
缓存是加分项,不能成为单点。


五、企业级落地总结(直说结论)✅

  • 穿透:布隆过滤器 + 空值缓存

  • 击穿:互斥锁 / 逻辑过期

  • 雪崩:TTL 随机化 + 多级缓存 + 限流

如果一个系统只用了 Redis,却没有并发治理、失效策略和兜底方案,那不是高性能架构,而是高风险架构

这套方案的价值不在“会不会用 Redis”,而在于——
你是否真正把 Redis 当作“系统稳定性组件”来设计。

如果你需要下一步:
👉结合真实业务 QPS 给出参数级建议,或者
👉画一份完整的缓存防护架构图(可直接用于方案评审)

可以直接继续往下拆。

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

蓝易云 - 如何在Ubuntu 22.04上安装PHP8.1并设置本地开发环境

下面给你一套在 Ubuntu 22.04 上落地 PHP 8.1 的本地开发环境方案,按“最稳、最少坑、可扩展”的工程化路径来做。🙂 1)安装策略先定:用官方源还是第三方源?🧭 方案适用场景风险/成本推荐度Ubuntu 22.04 官…

作者头像 李华
网站建设 2026/6/9 19:46:27

大数据的甘肃旅游网站研究与实现功能多

文章目录大数据驱动的甘肃旅游网站功能设计与实现摘要项目简介大数据系统开发流程主要运用技术介绍爬虫核心代码展示结论源码文档获取定制开发/同行可拿货,招校园代理 :文章底部获取博主联系方式!大数据驱动的甘肃旅游网站功能设计与实现摘要 甘肃作为丝…

作者头像 李华
网站建设 2026/5/29 5:55:45

性能测试自动化框架搭建:从基础到实践

在当今软件开发快速迭代的背景下,性能测试自动化框架成为提升测试效率、保障系统稳定性的关键工具。本文面向软件测试从业者,深入探讨框架搭建的全过程,结合行业最佳实践和案例,帮助您构建高效、可扩展的解决方案。一、性能测试自…

作者头像 李华
网站建设 2026/5/28 4:04:58

【Docker健康检查最佳实践】:掌握容器状态监控的5大核心技巧

第一章:Docker健康检查的核心价值与应用场景在容器化部署日益普及的今天,确保服务的持续可用性成为运维的关键目标。Docker 健康检查(HEALTHCHECK)机制为此提供了原生支持,能够主动探测容器内应用的运行状态&#xff0…

作者头像 李华
网站建设 2026/6/9 3:14:58

GA-PSO混合算法伽马辐射屏蔽优化【附代码】

✅ 博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。✅成品或者定制,扫描文章底部微信二维码。(1) GA-PSO串行混合优化算法与点核积分快速计算方法辐射屏蔽优化设计的目标是在满足辐…

作者头像 李华
网站建设 2026/5/31 7:45:32

知识传递改进多阶段约束多目标优化【附代码】

✅ 博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。✅成品或者定制,扫描文章底部微信二维码。(1) 多阶段约束多目标优化框架与知识传递机制设计约束多目标优化问题要求在满足多个约…

作者头像 李华