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

怎样在分布式限流组件中集成Redis以防止击穿击垮数据库?

大静吖_6688

大静吖_6688

发布时间:2026-09-05 08:36:23

|

719人浏览过

|

来源于php中文网

原创

限流必须在鉴权后、业务前统一拦截,如HandlerInterceptor.preHandle()中调用tryAcquire();若仅放在Controller层,则易被内网RPC、伪造token等绕过,失去防穿透作用。

怎样在分布式限流组件中集成redis以防止击穿击垮数据库?

限流必须在鉴权后、业务前统一拦截

限流组件如果只在 Controller 层调用 tryAcquire(),等于把守门人放在了门口大厅,而攻击者能从消防通道、员工电梯甚至屋顶直接跳进数据库机房。真实穿透常绕过 HTTP 入口:内网 RPC 调用、未鉴权的健康检查端点、伪造 token 的直连请求——这些都不会触发 Controller 里的限流逻辑。

正确做法是把限流嵌入 Spring 的 HandlerInterceptor.preHandle() 或自定义注解切面,在 JWT 解析完成、用户身份确认之后、任何 Service 方法执行之前就完成校验。这样无论请求来自网关、Feign 还是内部 Dubbo,只要走 Spring MVC 生命周期,就逃不过这一关。

  • 确保 preHandle() 返回 false 时直接写响应并 return,不放行到后续链路
  • 避免在多个 Service 方法里分散调用 tryAcquire(),易漏分支、难审计
  • 若用 Redisson,RRateLimiter 必须用 RateType.PER_CLIENT,name 参数要拼入真实用户标识(如 "user_rate:" + userId),不能写死

Redis 限流不是防穿透,而是防雪崩的兜底闸门

很多人误以为加了布隆过滤器或空值缓存,就不用限流了。但缓存击穿(单个热点 key 过期)和雪崩(大量 key 同时过期)本质是“合法请求暴增”,布隆过滤器对它们完全无效——它只在 bloomFilter.mightContain(key) 返回 false 时起作用;一旦返回 true(哪怕数据库里真没这数据),流程仍会走缓存 → 查库,照样可能打穿。

所以限流在这里的角色不是替代布隆过滤器,而是最后一道物理闸门:当 1000 个用户同时查刚过期的 product:1001,Redis 计数器发现已超阈值(比如 10 秒内最多 5 次),直接返回 429 Too Many Requests,连数据库连接都不建。

Redis Skill - 高性能缓存管理
Redis Skill - 高性能缓存管理

Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。

下载
  • 固定窗口算法(INCR + EXPIRE)够用,但要注意临界突刺问题;生产建议用滑动窗口 Lua 脚本(基于 ZSET),精度更高
  • Key 设计必须带业务维度,例如 sliding:uid:123:product:1001,避免不同用户/商品互相干扰
  • 别依赖 Redis 单点:加连接健康检查,Redis 不可用时自动降级为本地 Caffeine 限流,或启用熔断开关

线程池只管执行,不管放行决策

常见反模式是让线程池参与“等窗口释放”:请求进来先塞进队列,等 Redis 计数器刷新再处理。这违背限流本意——限流目标是快速拒绝,不是排队压测 JVM。

正确分工是:Redis 做原子化判断(允许/拒绝),仅“允许”的请求才提交给专用线程池执行业务逻辑。这样既防止 Redis 故障拖垮应用,又避免慢 SQL 或第三方调用阻塞整个 Tomcat 线程池。

  • 为限流后业务定义独立线程池,如 coreApiThreadPool,核心线程数按接口平均 RT 和目标 QPS 反推(例:200ms × 1000 QPS ≈ 200 线程)
  • 队列必须有界(如 ArrayBlockingQueue(100)),拒绝策略设为 CallerRunsPolicy,让 Web 容器线程自己执行,自然限速
  • 所有日志打上线程名前缀(如 "core-api-pool-3"),出问题时一眼定位是限流漏了,还是线程池堵了

令牌桶参数设置不当比不限流更危险

Redisson 的 trySetRate(RateType, rate, rateInterval, RateIntervalUnit) 四个参数里,rate 实际是桶容量(不是速率),rateInterval 才是填充周期。设成 rate=100, rateInterval=1, SECONDS,意思是“每秒往桶里加 1 个令牌,桶最大装 100 个”——这会导致突发流量瞬间耗光 100 令牌,之后整整 100 秒都拒绝请求,用户点击十次全失败。

真正合理的配置应匹配业务容忍度:登录接口建议 rate=5(桶大小 5)、rateInterval=60(每分钟补 1 个),既能防暴力撞库,又不误伤正常用户;而消息推送可设为 rate=1000, rateInterval=1。

  • 永远不要用 RateType.OVERALL 防击穿——它只控总量,无法阻止单个恶意用户刷爆一个 key
  • 如果业务用 JWT,务必在解析后校验 signature,否则攻击者篡改 userId 字段就能绕过 PER_CLIENT 限流
  • 测试时用 redis-cli --eval 直接跑 Lua 脚本验证逻辑,别只信单元测试——分布式场景下原子性只能靠 Redis 保证
实际最难的不是写对脚本或配好参数,而是厘清每一层的防御边界:布隆过滤器拦不存在的 key,互斥锁保热点重建不并发,限流卡住合法但过量的请求,熔断器在数据库开始抖动时主动断开。四者缺一不可,但顺序错了——比如把限流放在锁之后——就等于先让 100 个线程抢锁,再一起打库。

热门AI工具

更多
DeepSeek

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

二狗PPT
二狗PPT Hot

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

VibeKnow
VibeKnow Hot

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

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

WorkBuddy

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

豆包大模型

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

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

火山引擎

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

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

相关专题

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

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

2033

2023.08.11

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

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

3094

2023.10.07

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

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

4509

2023.11.02

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

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

4055

2023.11.14

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

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

7532

2024.04.02

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

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

643

2024.04.07

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

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

756

2024.04.07

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

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

7422

2024.04.07

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

60

2026.10.16

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

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

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