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

夜瑶酱_6722

夜瑶酱_6722

2026-07-14

1012人浏览

原创

滑动窗口限流比固定窗口更可靠,因其以当前时刻为右边界动态维护时间窗口(如最近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 + 时间戳桶,仅作兜底)。别指望一个注解包打天下,得根据接口重要性分层做限流。

相关文章

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

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

下载

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

相关专题

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

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

2025.08.06

2171

22

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

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

2026.01.26

417

25

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

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

2023.10.19

3048

3

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

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

2025.10.17

4289

12

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

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

2025.12.29

3689

9

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

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

2026.01.19

386

15

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

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

2023.11.02

4109

19

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

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

2023.11.14

3595

11

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

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

2024.04.02

6372

6

热门下载

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

精品课程

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

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习