From c2a13cabf66b0f0fdfbbd4365bf049b7585323ac Mon Sep 17 00:00:00 2001 From: lilong Date: Fri, 15 Mar 2024 18:22:03 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E4=BF=AE=E6=94=B9ratelimiter=E7=9A=84?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E5=88=9B=E5=BB=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/pokonyan/client/RateLimiter.java | 11 +------ .../client/impl/RedisRateLimiterImpl.java | 29 +++++++++---------- 2 files changed, 14 insertions(+), 26 deletions(-) diff --git a/src/main/java/cn/axzo/pokonyan/client/RateLimiter.java b/src/main/java/cn/axzo/pokonyan/client/RateLimiter.java index e440feb..f93af78 100644 --- a/src/main/java/cn/axzo/pokonyan/client/RateLimiter.java +++ b/src/main/java/cn/axzo/pokonyan/client/RateLimiter.java @@ -1,31 +1,22 @@ package cn.axzo.pokonyan.client; -import com.google.common.base.Splitter; -import com.google.common.base.Strings; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.Getter; import lombok.ToString; -import org.springframework.util.CollectionUtils; -import java.util.Collections; import java.util.List; -import java.util.Map; import java.util.Objects; -import java.util.Optional; -import java.util.stream.Collectors; public interface RateLimiter { /** * 尝试获得锁, 获取失败则返回Optional.empty() * 如果获取锁成功. 则返回Optional. 同时计数器增加 * Permit支持取消 - * - * @param value 业务标识 * @return */ - boolean tryAcquire(Object value); + boolean tryAcquire(); /** * 获取窗口类型 diff --git a/src/main/java/cn/axzo/pokonyan/client/impl/RedisRateLimiterImpl.java b/src/main/java/cn/axzo/pokonyan/client/impl/RedisRateLimiterImpl.java index 689d9d8..01d537f 100644 --- a/src/main/java/cn/axzo/pokonyan/client/impl/RedisRateLimiterImpl.java +++ b/src/main/java/cn/axzo/pokonyan/client/impl/RedisRateLimiterImpl.java @@ -24,12 +24,13 @@ public class RedisRateLimiterImpl implements RateLimiter { private LimitRule limitRule; private WindowType windowType; + private RRateLimiter rateLimiter; + @Builder RedisRateLimiterImpl(RedissonClient redissonClient, WindowType windowType, String limiterKey, - LimitRule limitRule, - Integer maxWindowDurationHour) { + LimitRule limitRule) { Objects.requireNonNull(redissonClient); Objects.requireNonNull(windowType); Objects.requireNonNull(limitRule); @@ -43,11 +44,16 @@ public class RedisRateLimiterImpl implements RateLimiter { this.limitRule = limitRule; this.limiterKey = limiterKey; this.rateLimiterWorker = buildWorker(windowType); + + String key = buildRedisKey(); + RRateLimiter rateLimiter = redissonClient.getRateLimiter(key); + rateLimiter.trySetRate(RateType.OVERALL, limitRule.getPermits(), limitRule.getSeconds(), RateIntervalUnit.SECONDS); + this.rateLimiter = rateLimiter; } @Override - public boolean tryAcquire(Object value) { - return rateLimiterWorker.tryAcquire(value); + public boolean tryAcquire() { + return rateLimiterWorker.tryAcquire(); } @Override @@ -62,10 +68,9 @@ public class RedisRateLimiterImpl implements RateLimiter { throw new RuntimeException(String.format("unsupported window type, window type = %s", windowType)); } - private String buildRedisKey(Object value) { + private String buildRedisKey() { String hash = Hashing.murmur3_128().newHasher() .putString(limiterKey, Charsets.UTF_8) - .putString(String.valueOf(value), Charsets.UTF_8) .hash() .toString(); @@ -81,14 +86,7 @@ public class RedisRateLimiterImpl implements RateLimiter { * */ class SlidingWindowRateLimiter implements RateLimiterWorker { - public boolean tryAcquire(Object value) { - String key = buildRedisKey(value); - - RRateLimiter rateLimiter = redissonClient.getRateLimiter(key); - if (!rateLimiter.isExists()) { - rateLimiter.trySetRate(RateType.OVERALL, limitRule.getPermits(), limitRule.getSeconds(), RateIntervalUnit.SECONDS); - } - + public boolean tryAcquire() { return rateLimiter.tryAcquire(1); } } @@ -97,9 +95,8 @@ public class RedisRateLimiterImpl implements RateLimiter { /** * 尝试获取令牌 * - * @param value * @return 如果获取成功则返回true, 失败则为false */ - boolean tryAcquire(Object value); + boolean tryAcquire(); } }