0

0

Redis缓存穿透怎么解决 Redis缓存雪崩击穿方案【详解】

月夜之吻

月夜之吻

发布时间:2026-01-23 08:53:47

|

807人浏览过

|

来源于php中文网

原创

缓存穿透、击穿、雪崩本质均为缓存失效致请求直冲数据库,需分别通过“守门”(空值缓存/布隆过滤器/参数校验)、“串行”(互斥锁/逻辑过期)和“错峰+冗余”(随机过期/多级缓存/集群预热)应对。

redis缓存穿透怎么解决 redis缓存雪崩击穿方案【详解】

缓存穿透、雪崩、击穿是 Redis 实际使用中最常见的三类高危问题,本质都是缓存失效或缺失导致请求直冲数据库,引发性能抖动甚至服务崩溃。解决思路不靠堆资源,而在于“提前拦截”“错峰控制”和“并发保护”。

缓存穿透:查一个根本不存在的 key

典型表现是大量请求查询数据库里压根没有的 ID(比如恶意刷无效订单号、爬虫遍历用户 ID),缓存没命中,数据库也没数据,每次都要走全链路,白白消耗连接和 CPU。

  • 空值缓存:查数据库返回 null 时,往 Redis 存一个特殊标记(如 red">"""NULL"),并设较短过期时间(比如 2–5 分钟)。后续同 key 请求直接命中缓存,不碰 DB。
  • 布隆过滤器预检:系统启动时把所有合法 key 加载进布隆过滤器(Bloom Filter)。请求来时先过滤器判断“可能有”,再查缓存;若过滤器说“肯定无”,直接拒绝。注意它有极小误判率(可调),但不漏判,适合防攻击场景。
  • 参数校验兜底:在接入层(如网关、Controller)对 key 做格式/范围校验(比如 ID 必须是正整数、手机号需符合规则),非法请求直接拦截,不进缓存和 DB。

缓存击穿:单个热 key 过期瞬间被并发打穿

比如某爆款商品详情页的缓存刚好到期,上百人同时刷新,全部涌向数据库查同一行记录。

VidAU
VidAU

VidAU AI 是一款AI驱动的数字人视频创作平台,旨在简化视频内容创作流程

下载
  • 互斥锁(分布式锁):缓存未命中时,用 Redis 的 SETNX 或 Redisson 加锁。只有一个线程能查 DB 并写回缓存,其余线程等待后直接读新缓存。适合 QPS 高但 key 数量有限的热点
  • 逻辑过期 + 异步重建:缓存 value 封装为含 expireTime 字段的对象,物理不过期。过期时只允许一个线程异步更新,其他请求仍返回旧数据(容忍短暂不一致),避免雪崩式等待。
  • 永不过期 + 定时刷新:对极关键且更新不频繁的热数据(如首页 Banner 配置),缓存不设 TTL,改由后台定时任务(如每 10 分钟)主动查库更新,保证数据新鲜又不触发击穿。

缓存雪崩:大批 key 集中失效或 Redis 整体宕机

最危险——不是个别请求出问题,而是整个服务链路承压。例如凌晨批量设置 2 小时 TTL,结果整点集体过期;或主节点宕机未及时切从。

  • 过期时间随机化:基础 TTL(如 30 分钟)基础上,叠加 0–10 分钟随机偏移量,让 key 失效时间分散开,避免扎堆。
  • 多级缓存 + 降级策略:本地 Caffeine 缓存 + Redis 作为二级。Redis 不可用时,自动降级读本地缓存(哪怕旧一点),或返回兜底静态页,保障基本可用。
  • 集群高可用 + 预热机制:用 Redis Cluster 或哨兵模式;大促前跑预热脚本,把核心 key 提前加载进缓存,避开冷启动高峰。

基本上就这些。三者虽常并列讲,但成因和解法逻辑不同:穿透重在“守门”,击穿重在“串行”,雪崩重在“错峰+冗余”。实际项目中往往组合使用,比如空值缓存 + 布隆过滤器防穿透,逻辑过期 + 分布式锁防击穿,随机 TTL + 集群容灾防雪崩。

相关专题

更多
什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

327

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

234

2023.10.07

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

233

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

437

2024.03.01

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

393

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

574

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

482

2023.08.10

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

976

2023.11.02

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

8

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
进程与SOCKET
进程与SOCKET

共6课时 | 0.3万人学习

Redis+MySQL数据库面试教程
Redis+MySQL数据库面试教程

共72课时 | 6.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号