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

Spring Boot如何通过Redis实现接口访问频率限制?

夜瑶酱_6722

夜瑶酱_6722

发布时间:2026-07-14 09:16:20

|

1012人浏览过

|

来源于php中文网

原创

滑动窗口限流比固定窗口更可靠,因其以当前时刻为右边界动态维护时间窗口(如最近1秒),用Redis ZSET存储时间戳并配合ZREMRANGEBYSCORE清理过期数据、ZCARD统计实时请求数,彻底解决窗口边界突刺问题。

spring boot如何通过redis实现接口访问频率限制?

直接结论:用 Redis + 滑动窗口(zset)比固定窗口更可靠,尤其在高并发、时间边界敏感的场景下;但若业务允许宽松限流,固定窗口(incr + expire)实现更快、调试更直观。

很多团队一开始用 redisTemplate.opsForValue().increment() 配合 expire() 做“每分钟最多 100 次”,上线后发现凌晨 00:59 和 01:01 各来 100 次,实际两秒内就扛了 200 次——这不是 bug,是固定窗口天然缺陷。下面说清楚怎么选、怎么写、怎么避坑。

固定窗口限流:适合简单场景,但必须注意并发安全

适用于内部管理接口、低频调用、或对“短时峰值”不敏感的业务(如后台导出按钮)。核心是:INCR + EXPIRE 原子性保障。

  • 错误写法:先 get() 再 set() + expire() —— 高并发下会漏计数或重复设过期时间
  • 正确做法:用 Lua 脚本封装原子操作(Spring Boot 中推荐 redisTemplate.execute(new DefaultRedisScript<>(...)))
  • key 设计建议用 "rate:ip:" + ip + ":url:" + requestUri,避免不同用户/路径冲突
  • 注意 expireTime 单位要和业务单位一致(比如配置 60 表示秒,代码里别误当成毫秒传给 expire())

滑动窗口限流:用 zset 实现任意时间窗口内精确计数

真正解决“00:59 到 01:01 突增”问题。本质是把每次请求时间戳作为 score 存进 ZSET,用 ZCOUNT 查指定时间范围内的 member 数量。

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

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

下载
  • key 示例:"sliding:ip:" + ip + ":url:" + requestUri
  • 插入命令:ZADD key timestamp request_id(timestamp 用 System.currentTimeMillis())
  • 查询命令:ZCOUNT key (start_timestamp +inf),其中 start_timestamp = now - window_ms
  • 务必搭配 ZREMRANGEBYSCORE 清理过期项,否则 zset 无限膨胀(可在每次检查前执行)
  • Spring 中推荐封装成 RedisCallback 或用 redisTemplate.opsForZSet().rangeByScore(),但注意它不自动清理,得自己加 zremrangebyscore

@RateLimiter 注解 + AOP:让限流逻辑和业务彻底解耦

不是所有接口都需要限流,也不是所有限流规则都一样。用注解驱动最灵活,但要注意切点表达式和参数提取逻辑。

  • 注解字段建议至少包含:count(阈值)、time(窗口秒数)、keyType(枚举:IP / USER_ID / URL / COMBINED)
  • AOP 中 key 生成不能只拼 joinPoint.getSignature().toShortString(),要结合上下文(如从 JWT 解析 userId,或从 header 取 X-Real-IP)
  • 拦截器里不要 throw 异常再全局捕获——直接 response.setStatus(429) + response.getWriter().write("too many requests") 更轻量
  • 如果用了 Spring Security,注意 RequestContextHolder 在异步线程中为空,需手动传递请求上下文

生产环境必须验证的三个细节

限流不是加完就完事。这三个点不验证,上线等于裸奔:

  • Redis 连接池配置是否合理?默认 max-active=8 在压测时极易成为瓶颈,建议设为 32–64,并开启 test-on-borrow
  • 限流失败时是否记录日志?至少要打 WARN 级别,含 key、currentCount、limit、ip、uri,方便溯源攻击源
  • 是否考虑多实例部署下的 key 冲突?比如用 hostname 或 spring.application.name 做 key 前缀,避免不同服务实例误判同一 IP

滑动窗口逻辑本身不复杂,难的是和业务上下文绑定、和运维监控打通、以及在 Redis 故障时有降级策略(比如本地 ConcurrentHashMap + 时间戳桶,仅作兜底)。别指望一个注解包打天下,得根据接口重要性分层做限流。

热门AI工具

更多
Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

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

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

DeepSeek

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

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

WorkBuddy

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

豆包大模型

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

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2211

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

417

2026.01.26

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3048

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

4329

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3689

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

386

2026.01.19

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

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

4169

2023.11.02

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

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

3635

2023.11.14

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

160

2026.09.23

热门下载

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

精品课程

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

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习

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

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