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 rateLimitAsync(String key, long rate, long capacity, long requested); + /** + * 令牌桶算法限流, 返回负数表示无令牌, 其他为有令牌 + *
+     * 每秒限制请求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 rateLimitAsync(String key, long rate, long capacity) { + return rateLimitAsync(key, rate, capacity, 1); + } + public CompletableFuture delexAsync(String key, String expectedValue); public CompletableFuture delAsync(String... keys);