From ac8d146c98971cfe9884ab47557a451083b45de6 Mon Sep 17 00:00:00 2001 From: redkale Date: Mon, 9 Sep 2024 20:03:21 +0800 Subject: [PATCH] CacheSource.lock --- .../java/org/redkale/source/CacheSource.java | 186 ++++++++++-------- 1 file changed, 102 insertions(+), 84 deletions(-) diff --git a/src/main/java/org/redkale/source/CacheSource.java b/src/main/java/org/redkale/source/CacheSource.java index 33c5bad40..d75f07a9b 100644 --- a/src/main/java/org/redkale/source/CacheSource.java +++ b/src/main/java/org/redkale/source/CacheSource.java @@ -125,6 +125,108 @@ public interface CacheSource extends Resourcable { public CompletableFuture publishAsync(String topic, byte[] message); + // ------------------------ 令牌桶算法限流 ------------------------ + /** + * 令牌桶算法限流, 返回负数表示无令牌, 其他为有令牌 + * + *
+     * 每秒限制请求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 令牌桶总容量 + * @param requested 需要的令牌数 + * @return 可用令牌数 + */ + default long rateLimit(String key, long rate, long capacity, long requested) { + 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); + } + + /** + * 令牌桶算法限流, 返回负数表示无令牌, 其他为有令牌 + * + *
+     * 每秒限制请求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 令牌桶总容量 + * @param requested 需要的令牌数 + * @return 可用令牌数 + */ + 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); + } + + // ------------------------ Lock ------------------------ + default boolean lock(String key, int expireSeconds) { + return setnxexString(key, expireSeconds, "1"); + } + + default void unlock(String key) { + del(key); + } + + default CompletableFuture lockAsync(String key, int expireSeconds) { + return setnxexStringAsync(key, expireSeconds, "1"); + } + + default CompletableFuture unlockAsync(String key) { + return delAsync(key).thenApply(v -> null); + } + // ------------------------ 字符串 String ------------------------ default long incr(String key) { return incrAsync(key).join(); @@ -366,49 +468,6 @@ public interface CacheSource extends Resourcable { } // ------------------------ 键 Keys ------------------------ - /** - * 令牌桶算法限流, 返回负数表示无令牌, 其他为有令牌 - * - *
-     * 每秒限制请求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 令牌桶总容量 - * @param requested 需要的令牌数 - * @return 可用令牌数 - */ - default long rateLimit(String key, long rate, long capacity, long requested) { - 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(); } @@ -1360,47 +1419,6 @@ public interface CacheSource extends Resourcable { } // ------------------------ 键 Keys ------------------------ - /** - * 令牌桶算法限流, 返回负数表示无令牌, 其他为有令牌 - * - *
-     * 每秒限制请求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 令牌桶总容量 - * @param requested 需要的令牌数 - * @return 可用令牌数 - */ - 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);