Feature - availablePermits method added to RSemaphore object. #2537

pull/2563/head
Nikita Koksharov 5 years ago
parent 6e8e0adb05
commit dd7c6c5c12

@ -256,4 +256,15 @@ public class RedissonRateLimiter extends RedissonObject implements RRateLimiter
return commandExecutor.readAsync(getName(), StringCodec.INSTANCE, HGETALL, getName()); return commandExecutor.readAsync(getName(), StringCodec.INSTANCE, HGETALL, getName());
} }
@Override
public long availablePermits() {
return get(availablePermitsAsync());
}
@Override
public RFuture<Long> availablePermitsAsync() {
return commandExecutor.writeAsync(getName(), LongCodec.INSTANCE, RedisCommands.GET_LONG, getValueName());
}
} }

@ -148,4 +148,11 @@ public interface RRateLimiter extends RRateLimiterAsync, RObject {
*/ */
RateLimiterConfig getConfig(); RateLimiterConfig getConfig();
/**
* Returns amount of available permits.
*
* @return number of permits
*/
long availablePermits();
} }

@ -150,4 +150,11 @@ public interface RRateLimiterAsync extends RObjectAsync {
*/ */
RFuture<RateLimiterConfig> getConfigAsync(); RFuture<RateLimiterConfig> getConfigAsync();
/**
* Returns amount of available permits.
*
* @return number of permits
*/
RFuture<Long> availablePermitsAsync();
} }

@ -15,10 +15,10 @@
*/ */
package org.redisson.api; package org.redisson.api;
import java.util.concurrent.TimeUnit;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
import java.util.concurrent.TimeUnit;
/** /**
* Reactive interface for Redis based Rate Limiter object. * Reactive interface for Redis based Rate Limiter object.
* *
@ -145,4 +145,11 @@ public interface RRateLimiterReactive extends RObjectReactive {
*/ */
Mono<Boolean> tryAcquire(long permits, long timeout, TimeUnit unit); Mono<Boolean> tryAcquire(long permits, long timeout, TimeUnit unit);
/**
* Returns amount of available permits.
*
* @return number of permits
*/
Mono<Long> availablePermits();
} }

@ -15,11 +15,11 @@
*/ */
package org.redisson.api; package org.redisson.api;
import java.util.concurrent.TimeUnit;
import io.reactivex.Completable; import io.reactivex.Completable;
import io.reactivex.Single; import io.reactivex.Single;
import java.util.concurrent.TimeUnit;
/** /**
* Reactive interface for Redis based Rate Limiter object. * Reactive interface for Redis based Rate Limiter object.
* *
@ -146,4 +146,11 @@ public interface RRateLimiterRx extends RObjectRx {
*/ */
Single<Boolean> tryAcquire(long permits, long timeout, TimeUnit unit); Single<Boolean> tryAcquire(long permits, long timeout, TimeUnit unit);
/**
* Returns amount of available permits.
*
* @return number of permits
*/
Single<Long> availablePermits();
} }

@ -41,14 +41,19 @@ public class RedissonRateLimiterTest extends BaseTest {
@Test @Test
public void testZeroTimeout() throws InterruptedException { public void testZeroTimeout() throws InterruptedException {
RRateLimiter limiter = redisson.getRateLimiter("myLimiter"); RRateLimiter limiter = redisson.getRateLimiter("myLimiter");
assertThat(limiter.availablePermits()).isEqualTo(0);
limiter.trySetRate(RateType.OVERALL, 5, 1, RateIntervalUnit.SECONDS); 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.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.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.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(); assertThat(limiter.tryAcquire(1, 0, TimeUnit.SECONDS)).isFalse();
assertThat(limiter.tryAcquire(1, 0, TimeUnit.SECONDS)).isFalse(); assertThat(limiter.tryAcquire(1, 0, TimeUnit.SECONDS)).isFalse();

Loading…
Cancel
Save