怎样在分布式环境中使用Redis实现防穿透熔断_结合Sentinel限流策略

秋涛同学_7460

秋涛同学_7460

2026-06-24

927人浏览

原创

Redis本身不提供熔断能力,熔断降级需在应用层实现;应结合缓存空值+随机TTL、连接池治理及按业务维度隔离的熔断器协同防御缓存击穿。

怎样在分布式环境中使用redis实现防穿透熔断_结合sentinel限流策略

Redis 本身不提供熔断能力,防穿透和熔断必须靠上层框架(如 Sentinel)或业务代码主动判断;Redis 只能做分布式计数、状态标记、信号存储——它只是“信号板”,不是“决策者”。

为什么 Redis 不能直接熔断

Redis 是无状态的键值存储,没有内置的失败统计、状态机、半开探测或自动切换逻辑。所谓“Redis 熔断”,本质是应用层用 Redis 存数据(比如 fail_count:order-service)、读数据(比如 sentinel:state:order-service),再由 Sentinel 或自定义逻辑做判断和降级。常见误解是把 Redis 当成熔断器,其实它只承担两个角色:

  • 共享故障计数器:多个实例写入同一 key(如用 INCR + EXPIRE 统计 1 分钟内异常次数)
  • 全局开关存储:用 SETNX 写入 circuit_breaker:order-service 表示已熔断,所有节点读这个 key 决定是否跳过调用

如果直接在 Redis 里写 Lua 脚本模拟熔断状态机,会因脚本不可中断、无法跨 key 原子更新、缺乏时序控制而极易出错——这不是设计用途。

Sentinel 怎么结合 Redis 做防穿透熔断

Sentinel 的 @SentinelResource 注解本身不依赖 Redis,但你可以用 Redis 作为其外部状态源,实现“跨实例一致的熔断判定”。关键不在注解,而在 blockHandler 和 fallback 里的配合逻辑:

  • 在 handleBlock 方法里,不只是返回兜底值,还要调用 redisTemplate.opsForValue().increment("fail_count:" + resource) 记录本次被限流/失败的请求
  • 另起一个定时任务(或用 Spring Scheduler),每 10 秒扫描所有 fail_count:*,对连续 5 次超阈值(如 1 分钟失败 ≥ 20 次)的服务,执行 redisTemplate.opsForValue().set("circuit_breaker:" + resource, "OPEN", 60, TimeUnit.SECONDS)
  • 在业务方法入口加一层 AOP 切面,先查 redisTemplate.opsForValue().get("circuit_breaker:" + resource),若为 "OPEN" 直接 throw BlockException,触发 Sentinel 的 fallback 流程
  • 不要把熔断状态存在本地内存(ConcurrentHashMap),否则多实例间不同步;Redis 是唯一能保证“所有节点看到同一熔断状态”的共享媒介

防穿透:Redis 在缓存击穿场景下的真实作用

“防穿透”常被误认为是熔断子集,其实它是独立问题:恶意请求查大量不存在的 user:id=999999999,导致缓存 miss、DB 压力飙升。Redis 在这里不是挡刀的,而是配合布隆过滤器或空值缓存做“前置过滤”:

Sentinal Redis
Sentinal Redis

监控Redis服务器健康状况、内存、性能及BullMQ队列。检查队列深度、失败任务,分析慢查询并诊断问题。

下载
  • 布隆过滤器(Bloom Filter)部署在网关或应用内存中,快速判断 ID 是否“可能不存在”;若返回 false,直接拒绝,不碰 Redis
  • 若布隆说“可能存在”,再查 Redis —— 若 key 不存在,**必须写入一个短 TTL 的空值**,如 SET user:999999999 "" EX 60,防止重复穿透
  • 注意:空值不能永久缓存,否则脏数据无法更新;也不能 TTL 过短(如 1s),否则起不到防护作用;60s 是较稳妥的折中值
  • 若用 Redisson 的 RLocalCachedMap,记得关闭 writeMode = WRITE_THROUGH,否则空值会同步写 DB,反而加重穿透

最容易被忽略的三个点

第一,Sentinel 的熔断统计默认只看本实例的异常,不做集群聚合 —— 如果你有 10 个订单服务实例,每个都报 3 次 DB 超时,Sentinel 不会自动合并成“总失败 30 次”,必须靠 Redis 中央计数器补足;

第二,Redis 故障时,circuit_breaker:* key 读不到,应默认走“CLOSE”态(即放行),而不是卡死或抛 NPE —— 否则 Redis 挂了,熔断器也跟着瘫痪;

第三,空值缓存的 key 命名必须带业务前缀且可预测,否则布隆过滤器无法预判,例如 user:id=123 和 user:123 是两个 key,过滤器校验的格式必须和实际 Redis 查询完全一致。

相关文章

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

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

下载

相关标签:

redis

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

相关专题

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

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

2023.08.11

2193

5

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

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

2023.10.07

3694

5

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

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

2023.11.02

4949

19

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.14

4515

11

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

8772

6

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

683

6

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

776

6

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

9142

6

redis缓存一般存些什么数据
redis缓存一般存些什么数据

redis缓存中存储的数据类型包括:字符串、哈希、列表、集合、有序集合、位图、地理空间数据和hyperloglog。这些数据类型适用于存储各种数据,从简单信息到复杂对象和地理位置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1200

6

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go-Zero官方文档
Go-Zero官方文档

共0课时 | 0人学习