讲师中心 微信公众号
AI工具推荐 视频效率加速

Redis怎样应对Redis集群整体宕机带来的雪崩

轻雪酱_8741

轻雪酱_8741

发布时间:2026-03-29 07:49:14

|

650人浏览过

|

来源于php中文网

原创

缓存雪崩的本质是Redis集群宕机导致所有请求绕过缓存直击数据库,引发DB QPS暴增、连接池打满、CPU 100%而崩溃;Java中需通过熔断器切断“缓存未命中→查库”链路,改走降级路径,并配合本地缓存+异步回源+分级熔断+预热等策略防控。

redis怎样应对redis集群整体宕机带来的雪崩

Redis集群整体宕机时,缓存雪崩的本质是什么

不是“缓存没数据”,而是“所有请求瞬间绕过缓存直击数据库”——Redis集群一挂,redis.get() 全部抛异常或超时,业务代码若没做兜底,就会无差别调用 userMapper.selectById() 这类数据库操作。数据库QPS从几百飙到几万,连接池打满、CPU 100%、慢查询堆积,5分钟内可能就不可逆崩溃。

Java项目里,怎么让Redis宕机时不连数据库

核心是切断“缓存未命中 → 查库”的默认链路,改走降级路径。重点不在Redis客户端配置,而在业务方法的控制流改造:

  • 别依赖 try-catch 捕获 JedisConnectionException 后再查库——太晚,异常已发生,且并发下大量线程卡在DB连接上
  • 用熔断器(如 Sentinel)监控 redis.get() 的失败率和响应时间,失败率 > 50% 或平均延迟 > 200ms 时自动打开熔断器
  • 熔断开启后,直接返回预设兜底值:new User().setUsername("游客").setLevel(0),或从本地缓存(如 Caffeine)读取静态快照
  • 避免全局熔断:按 key 前缀分级,比如 "user:*" 熔断不影响 "config:*",防止配置类数据也失效

为什么光靠哨兵/集群高可用还不够

哨兵能切主,但切换需要时间(通常 2–10 秒),这期间所有 set/get 请求都会失败;集群分片故障也可能只影响某几个 slot,导致部分 key 永远无法访问。更关键的是:即使 Redis 恢复了,缓存是空的——冷启动阶段照样雪崩。

  • 哨兵不解决“数据丢失后如何不压垮DB”的问题,它只管服务地址是否可连
  • 集群节点数越多,故障传播越快:一个节点网络抖动可能触发多个分片重平衡,放大延迟
  • 必须配合“缓存预热”:在运维重启集群前,用脚本调用 redisTemplate.opsForValue().set() 提前灌入热点 key,而不是等用户请求来触发

本地缓存 + 异步回源,怎么防穿透又防雪崩

本地缓存(如 Caffeine)不是用来替代 Redis,而是当 Redis 不可用时的“缓冲垫”。难点在于更新一致性与空值处理:

  • 本地缓存过期时间要明显短于 Redis(如 Redis 设 1h,本地设 5min),避免 Redis 恢复后本地还挂着脏数据
  • 数据库查不到时,仍要写本地缓存(cache.put(key, null)),但过期时间设成 60 秒,防止缓存穿透放大
  • 回源必须异步:用线程池提交 updateRedisAndLocalCache(key),主流程绝不等待,否则本地缓存失效瞬间也会引发并发查库
  • 别用 synchronized 锁本地变量——锁粒度太粗,会把所有请求串行化;改用 ConcurrentHashMap.computeIfAbsent() 做轻量级互斥

最常被忽略的一点:降级逻辑必须和 Redis 客户端解耦。不要在 RedisTemplate 的 afterPropertiesSet() 里埋降级开关,而应统一收口到一个 CacheService.get(String key, Supplier<t> fallback)</t> 方法里——这样未来换成其他缓存中间件,降级策略不用动一行。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

相关专题

更多
什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

669

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

624

2025.12.18

ThinkPHP中间件机制与请求拦截处理实践
ThinkPHP中间件机制与请求拦截处理实践

本专题围绕 ThinkPHP 中间件体系展开,深入讲解中间件的定义、注册与执行流程。内容包括全局中间件与路由中间件的区别、请求前后处理逻辑、自定义中间件开发以及权限验证与日志处理应用。通过实际案例,帮助开发者掌握中间件在项目中的核心作用与最佳实践。

438

2026.03.31

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6679

2023.08.02

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

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

549

2023.09.22

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

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

1698

2024.03.01

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

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

6127

2023.07.18

堆和栈区别
堆和栈区别

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

2588

2023.08.10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

热门下载

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

精品课程

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn