From 8745dc3567dd4aa93fd41e93e4a8e9b4df62b9be Mon Sep 17 00:00:00 2001 From: yukaidi Date: Thu, 28 May 2026 23:16:53 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20RateLimiter=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E8=BF=87=E6=9C=9F=E6=9D=A1=E7=9B=AE=E6=B8=85=E7=90=86=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20ipRequestMap=20=E6=97=A0=E9=99=90=E5=A2=9E?= =?UTF-8?q?=E9=95=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 当 Map 超过 1000 条目时触发惰性清理,移除所有已过期的 IP 条目。 原实现中过期条目只重置计数不删除 key,长期运行后 Map 持续膨胀。 同时消除多余的 ipRequestMap.get(ip) 调用,直接使用 compute() 返回值。 --- .../cn/qaiu/lz/common/interceptorImpl/RateLimiter.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/web-service/src/main/java/cn/qaiu/lz/common/interceptorImpl/RateLimiter.java b/web-service/src/main/java/cn/qaiu/lz/common/interceptorImpl/RateLimiter.java index e595714..26612b9 100644 --- a/web-service/src/main/java/cn/qaiu/lz/common/interceptorImpl/RateLimiter.java +++ b/web-service/src/main/java/cn/qaiu/lz/common/interceptorImpl/RateLimiter.java @@ -38,7 +38,13 @@ public class RateLimiter { String ip = request.remoteAddress().host(); - ipRequestMap.compute(ip, (key, requestInfo) -> { + // 定期清理过期条目,防止 Map 无限增长 + if (ipRequestMap.size() > 1000) { + long now = System.currentTimeMillis(); + ipRequestMap.entrySet().removeIf(entry -> now - entry.getValue().timestamp > TIME_WINDOW); + } + + RequestInfo info = ipRequestMap.compute(ip, (key, requestInfo) -> { long currentTime = System.currentTimeMillis(); if (requestInfo == null || currentTime - requestInfo.timestamp > TIME_WINDOW) { // 初始化或重置计数器 @@ -50,7 +56,6 @@ public class RateLimiter { } }); - RequestInfo info = ipRequestMap.get(ip); if (info.count > MAX_REQUESTS) { // 超过限制 // 计算剩余时间