java springboot接口限流实现
通过redis实现,一秒内同一个用户,限制请求一次
1 2 3 4 5 6 7 | // 限流逻辑 String rateLimitKey = RATE_LIMIT_KEY_PREFIX + userImageUrl; Boolean isLimited = stringRedisTemplate.opsForValue().setIfAbsent(rateLimitKey, "1" , 1 , TimeUnit.SECONDS); if (isLimited == null || !isLimited) { logger.warn( "User {} is submitting too frequently. Request rejected." , userImageUrl); throw new RuntimeException( "You can only submit once every second." ); } |
解释
限流逻辑:
String rateLimitKey = RATE_LIMIT_KEY_PREFIX + userImageUrl;:生成一个唯一的 Redis 键,用于标识用户的限流状态。
Boolean isLimited = stringRedisTemplate.opsForValue().setIfAbsent(rateLimitKey, "1", 1, TimeUnit.SECONDS);:使用 setIfAbsent 方法设置键值对,如果键已经存在则返回 false,否则返回 true 并设置键的过期时间为 1 秒。
if (isLimited == null || !isLimited):如果 isLimited 为 false,说明用户已经在一秒内提交过请求,拒绝该请求并抛出异常。
日志记录:
使用 logger.warn 记录被限流的请求,便于调试和监控。
其他操作:
生成作品数据、设置 Redis 状态、将参数放入缓存、将任务放入队列等操作保持不变。
通过这种方式,可以确保在一秒内同一个用户只能提交一次请求,从而避免频繁提交导致的并发问题。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?