diff --git a/redisson/src/main/java/org/redisson/RedissonRateLimiter.java b/redisson/src/main/java/org/redisson/RedissonRateLimiter.java index 8904272cc..46111f006 100644 --- a/redisson/src/main/java/org/redisson/RedissonRateLimiter.java +++ b/redisson/src/main/java/org/redisson/RedissonRateLimiter.java @@ -255,5 +255,16 @@ public class RedissonRateLimiter extends RedissonObject implements RRateLimiter public RFuture getConfigAsync() { return commandExecutor.readAsync(getName(), StringCodec.INSTANCE, HGETALL, getName()); } - + + @Override + public long availablePermits() { + return get(availablePermitsAsync()); + } + + @Override + public RFuture availablePermitsAsync() { + return commandExecutor.writeAsync(getName(), LongCodec.INSTANCE, RedisCommands.GET_LONG, getValueName()); + } + + } diff --git a/redisson/src/main/java/org/redisson/api/RRateLimiter.java b/redisson/src/main/java/org/redisson/api/RRateLimiter.java index b264569d0..0567a5139 100644 --- a/redisson/src/main/java/org/redisson/api/RRateLimiter.java +++ b/redisson/src/main/java/org/redisson/api/RRateLimiter.java @@ -147,5 +147,12 @@ public interface RRateLimiter extends RRateLimiterAsync, RObject { * @return config object */ RateLimiterConfig getConfig(); - + + /** + * Returns amount of available permits. + * + * @return number of permits + */ + long availablePermits(); + } diff --git a/redisson/src/main/java/org/redisson/api/RRateLimiterAsync.java b/redisson/src/main/java/org/redisson/api/RRateLimiterAsync.java index 498b68885..19a077b9c 100644 --- a/redisson/src/main/java/org/redisson/api/RRateLimiterAsync.java +++ b/redisson/src/main/java/org/redisson/api/RRateLimiterAsync.java @@ -149,5 +149,12 @@ public interface RRateLimiterAsync extends RObjectAsync { * @return config object */ RFuture getConfigAsync(); - + + /** + * Returns amount of available permits. + * + * @return number of permits + */ + RFuture availablePermitsAsync(); + } diff --git a/redisson/src/main/java/org/redisson/api/RRateLimiterReactive.java b/redisson/src/main/java/org/redisson/api/RRateLimiterReactive.java index f99030e44..2fde5fd17 100644 --- a/redisson/src/main/java/org/redisson/api/RRateLimiterReactive.java +++ b/redisson/src/main/java/org/redisson/api/RRateLimiterReactive.java @@ -15,10 +15,10 @@ */ package org.redisson.api; -import java.util.concurrent.TimeUnit; - import reactor.core.publisher.Mono; +import java.util.concurrent.TimeUnit; + /** * Reactive interface for Redis based Rate Limiter object. * @@ -144,5 +144,12 @@ public interface RRateLimiterReactive extends RObjectReactive { * if the waiting time elapsed before a permit was acquired */ Mono tryAcquire(long permits, long timeout, TimeUnit unit); - + + /** + * Returns amount of available permits. + * + * @return number of permits + */ + Mono availablePermits(); + } diff --git a/redisson/src/main/java/org/redisson/api/RRateLimiterRx.java b/redisson/src/main/java/org/redisson/api/RRateLimiterRx.java index d79447829..8bbe4657f 100644 --- a/redisson/src/main/java/org/redisson/api/RRateLimiterRx.java +++ b/redisson/src/main/java/org/redisson/api/RRateLimiterRx.java @@ -15,11 +15,11 @@ */ package org.redisson.api; -import java.util.concurrent.TimeUnit; - import io.reactivex.Completable; import io.reactivex.Single; +import java.util.concurrent.TimeUnit; + /** * Reactive interface for Redis based Rate Limiter object. * @@ -145,5 +145,12 @@ public interface RRateLimiterRx extends RObjectRx { * if the waiting time elapsed before a permit was acquired */ Single tryAcquire(long permits, long timeout, TimeUnit unit); - + + /** + * Returns amount of available permits. + * + * @return number of permits + */ + Single availablePermits(); + } diff --git a/redisson/src/test/java/org/redisson/RedissonRateLimiterTest.java b/redisson/src/test/java/org/redisson/RedissonRateLimiterTest.java index fab0becc0..05d4ab93c 100644 --- a/redisson/src/test/java/org/redisson/RedissonRateLimiterTest.java +++ b/redisson/src/test/java/org/redisson/RedissonRateLimiterTest.java @@ -41,14 +41,19 @@ public class RedissonRateLimiterTest extends BaseTest { @Test public void testZeroTimeout() throws InterruptedException { RRateLimiter limiter = redisson.getRateLimiter("myLimiter"); + assertThat(limiter.availablePermits()).isEqualTo(0); limiter.trySetRate(RateType.OVERALL, 5, 1, RateIntervalUnit.SECONDS); assertThat(limiter.tryAcquire(1, 0, TimeUnit.SECONDS)).isTrue(); assertThat(limiter.tryAcquire(1, 0, TimeUnit.SECONDS)).isTrue(); + assertThat(limiter.availablePermits()).isEqualTo(3); assertThat(limiter.tryAcquire(1, 0, TimeUnit.SECONDS)).isTrue(); assertThat(limiter.tryAcquire(1, 0, TimeUnit.SECONDS)).isTrue(); + assertThat(limiter.availablePermits()).isEqualTo(1); assertThat(limiter.tryAcquire(1, 0, TimeUnit.SECONDS)).isTrue(); - + + assertThat(limiter.availablePermits()).isEqualTo(0); + assertThat(limiter.tryAcquire(1, 0, TimeUnit.SECONDS)).isFalse(); assertThat(limiter.tryAcquire(1, 0, TimeUnit.SECONDS)).isFalse(); assertThat(limiter.tryAcquire(1, 0, TimeUnit.SECONDS)).isFalse();