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

轻雪酱_8741

轻雪酱_8741

2026-03-29

650人浏览

原创

缓存雪崩的本质是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> 方法里——这样未来换成其他缓存中间件,降级策略不用动一行。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

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

相关专题

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

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

2024.05.11

669

5

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

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

2025.12.18

644

18

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

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

2026.03.31

438

17

string转int
string转int

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

2023.08.02

6719

3

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

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

2023.09.22

549

3

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

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

2024.03.01

1698

6

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

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

2023.07.18

6187

5

堆和栈区别
堆和栈区别

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

2023.08.10

2608

6

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

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

2023.08.10

4398

6

热门下载

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

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习