diff --git a/src/main/java/org/redkale/source/CacheMemorySource.java b/src/main/java/org/redkale/source/CacheMemorySource.java index c593af2ac..3ffb3b8d4 100644 --- a/src/main/java/org/redkale/source/CacheMemorySource.java +++ b/src/main/java/org/redkale/source/CacheMemorySource.java @@ -160,6 +160,15 @@ public final class CacheMemorySource extends AbstractCacheSource { expireHandler.accept(entry); } } + long now2 = System.currentTimeMillis(); + rateLimitContainer.forEach((k, x) -> { + if (x.expireMills > 0 && (now2 > (x.lastAccessed + x.expireMills))) { + keys.add(x.key); + } + }); + for (String key : keys) { + rateLimitContainer.remove(key); + } } catch (Throwable t) { logger.log(Level.SEVERE, "CacheMemorySource schedule(interval=" + 10 + "s) error", t); } diff --git a/src/main/java/org/redkale/source/CacheSource.java b/src/main/java/org/redkale/source/CacheSource.java index 9c8c9e815..3653154d0 100644 --- a/src/main/java/org/redkale/source/CacheSource.java +++ b/src/main/java/org/redkale/source/CacheSource.java @@ -386,6 +386,27 @@ public interface CacheSource extends Resourcable { return rateLimitAsync(key, rate, capacity, requested).join(); } + /** + * 令牌桶算法限流, 返回负数表示无令牌, 其他为有令牌 + *
+ * 每秒限制请求1次: rate:1, capacity:1, requested:1 + * 每秒限制请求10次: rate:10, capacity:10, requested:1 + * 每分钟限制请求1次: rate:1, capacity:60, requested:60 + * 每分钟限制请求10次: rate:1, capacity:60, requested:6 + * 每小时限制请求1次: rate:1, capacity:3600, requested:3600 + * 每小时限制请求10次: rate:1, capacity:3600, requested:360 + *+ * + * @param key 限流的键 + * @param rate 令牌桶每秒填充平均速率 + * @param capacity 令牌桶总容量 + * + * @return 可用令牌数 + */ + default long rateLimit(String key, long rate, long capacity) { + return rateLimit(key, rate, capacity, 1); + } + default long del(String... keys) { return delAsync(keys).join(); } @@ -1346,6 +1367,27 @@ public interface CacheSource extends Resourcable { */ public CompletableFuture
+ * 每秒限制请求1次: rate:1, capacity:1, requested:1 + * 每秒限制请求10次: rate:10, capacity:10, requested:1 + * 每分钟限制请求1次: rate:1, capacity:60, requested:60 + * 每分钟限制请求10次: rate:1, capacity:60, requested:6 + * 每小时限制请求1次: rate:1, capacity:3600, requested:3600 + * 每小时限制请求10次: rate:1, capacity:3600, requested:360 + *+ * + * @param key 限流的键 + * @param rate 令牌桶每秒填充平均速率 + * @param capacity 令牌桶总容量 + * + * @return 可用令牌数 + */ + default CompletableFuture