CacheSource

This commit is contained in:
redkale
2024-01-20 14:25:08 +08:00
parent 47584f3106
commit f9994b33af
2 changed files with 51 additions and 0 deletions

View File

@@ -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);
}

View File

@@ -386,6 +386,27 @@ public interface CacheSource extends Resourcable {
return rateLimitAsync(key, rate, capacity, requested).join();
}
/**
* 令牌桶算法限流, 返回负数表示无令牌, 其他为有令牌
* <pre>
* 每秒限制请求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
* </pre>
*
* @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<Long> rateLimitAsync(String key, long rate, long capacity, long requested);
/**
* 令牌桶算法限流, 返回负数表示无令牌, 其他为有令牌
* <pre>
* 每秒限制请求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
* </pre>
*
* @param key 限流的键
* @param rate 令牌桶每秒填充平均速率
* @param capacity 令牌桶总容量
*
* @return 可用令牌数
*/
default CompletableFuture<Long> rateLimitAsync(String key, long rate, long capacity) {
return rateLimitAsync(key, rate, capacity, 1);
}
public CompletableFuture<Long> delexAsync(String key, String expectedValue);
public CompletableFuture<Long> delAsync(String... keys);