From fae3ad84fb83fd533d33897e8171c1f85684ce88 Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Thu, 6 Dec 2018 13:46:13 +0300 Subject: [PATCH] Feature - getCountDownLatch, getSemaphore, getPermitExpirableSemaphore, getFairLock methods added to RMap #1783 --- .../src/main/java/org/redisson/Redisson.java | 4 +++ .../java/org/redisson/RedissonFairLock.java | 2 +- .../main/java/org/redisson/RedissonMap.java | 27 ++++++++++++++++ .../src/main/java/org/redisson/api/RMap.java | 32 +++++++++++++++++++ .../transaction/RedissonTransactionalMap.java | 23 +++++++++++++ .../RedissonTransactionalMapCache.java | 23 +++++++++++++ 6 files changed, 110 insertions(+), 1 deletion(-) diff --git a/redisson/src/main/java/org/redisson/Redisson.java b/redisson/src/main/java/org/redisson/Redisson.java index aee5fd6cf..45df4ab55 100755 --- a/redisson/src/main/java/org/redisson/Redisson.java +++ b/redisson/src/main/java/org/redisson/Redisson.java @@ -124,6 +124,10 @@ public class Redisson implements RedissonClient { evictionScheduler = new EvictionScheduler(connectionManager.getCommandExecutor()); } + public SemaphorePubSub getSemaphorePubSub() { + return semaphorePubSub; + } + public EvictionScheduler getEvictionScheduler() { return evictionScheduler; } diff --git a/redisson/src/main/java/org/redisson/RedissonFairLock.java b/redisson/src/main/java/org/redisson/RedissonFairLock.java index 407a1fdd3..257e05505 100644 --- a/redisson/src/main/java/org/redisson/RedissonFairLock.java +++ b/redisson/src/main/java/org/redisson/RedissonFairLock.java @@ -45,7 +45,7 @@ public class RedissonFairLock extends RedissonLock implements RLock { private final String threadsQueueName; private final String timeoutSetName; - protected RedissonFairLock(CommandAsyncExecutor commandExecutor, String name) { + public RedissonFairLock(CommandAsyncExecutor commandExecutor, String name) { super(commandExecutor, name); this.commandExecutor = commandExecutor; threadsQueueName = prefixName("redisson_lock_queue", name); diff --git a/redisson/src/main/java/org/redisson/RedissonMap.java b/redisson/src/main/java/org/redisson/RedissonMap.java index 18b6f4bd9..a50e0f103 100644 --- a/redisson/src/main/java/org/redisson/RedissonMap.java +++ b/redisson/src/main/java/org/redisson/RedissonMap.java @@ -33,11 +33,14 @@ import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.atomic.AtomicInteger; import org.redisson.api.MapOptions; +import org.redisson.api.RCountDownLatch; import org.redisson.api.MapOptions.WriteMode; import org.redisson.api.RFuture; import org.redisson.api.RLock; import org.redisson.api.RMap; +import org.redisson.api.RPermitExpirableSemaphore; import org.redisson.api.RReadWriteLock; +import org.redisson.api.RSemaphore; import org.redisson.api.RedissonClient; import org.redisson.api.mapreduce.RMapReduce; import org.redisson.client.RedisClient; @@ -106,7 +109,31 @@ public class RedissonMap extends RedissonExpirable implements RMap { public RMapReduce mapReduce() { return new RedissonMapReduce(this, redisson, commandExecutor.getConnectionManager()); } + + @Override + public RPermitExpirableSemaphore getPermitExpirableSemaphore(K key) { + String lockName = getLockName(key, "permitexpirablesemaphore"); + return new RedissonPermitExpirableSemaphore(commandExecutor, lockName, ((Redisson)redisson).getSemaphorePubSub()); + } + @Override + public RSemaphore getSemaphore(K key) { + String lockName = getLockName(key, "semaphore"); + return new RedissonSemaphore(commandExecutor, lockName, ((Redisson)redisson).getSemaphorePubSub()); + } + + @Override + public RCountDownLatch getCountDownLatch(K key) { + String lockName = getLockName(key, "countdownlatch"); + return new RedissonCountDownLatch(commandExecutor, lockName); + } + + @Override + public RLock getFairLock(K key) { + String lockName = getLockName(key, "fairlock"); + return new RedissonFairLock(commandExecutor, lockName); + } + @Override public RLock getLock(K key) { String lockName = getLockName(key, "lock"); diff --git a/redisson/src/main/java/org/redisson/api/RMap.java b/redisson/src/main/java/org/redisson/api/RMap.java index 75b48702b..077da9d28 100644 --- a/redisson/src/main/java/org/redisson/api/RMap.java +++ b/redisson/src/main/java/org/redisson/api/RMap.java @@ -103,6 +103,38 @@ public interface RMap extends ConcurrentMap, RExpirable, RMapAsync RMapReduce mapReduce(); + + /** + * Returns RCountDownLatch instance associated with key + * + * @param key - map key + * @return readWriteLock + */ + RCountDownLatch getCountDownLatch(K key); + + /** + * Returns RPermitExpirableSemaphore instance associated with key + * + * @param key - map key + * @return readWriteLock + */ + RPermitExpirableSemaphore getPermitExpirableSemaphore(K key); + + /** + * Returns RSemaphore instance associated with key + * + * @param key - map key + * @return readWriteLock + */ + RSemaphore getSemaphore(K key); + + /** + * Returns RReadWriteLock instance associated with key + * + * @param key - map key + * @return readWriteLock + */ + RLock getFairLock(K key); /** * Returns RReadWriteLock instance associated with key diff --git a/redisson/src/main/java/org/redisson/transaction/RedissonTransactionalMap.java b/redisson/src/main/java/org/redisson/transaction/RedissonTransactionalMap.java index 45f7af3e5..3325d1a56 100644 --- a/redisson/src/main/java/org/redisson/transaction/RedissonTransactionalMap.java +++ b/redisson/src/main/java/org/redisson/transaction/RedissonTransactionalMap.java @@ -24,10 +24,13 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import org.redisson.RedissonMap; +import org.redisson.api.RCountDownLatch; import org.redisson.api.RFuture; import org.redisson.api.RLock; import org.redisson.api.RMap; +import org.redisson.api.RPermitExpirableSemaphore; import org.redisson.api.RReadWriteLock; +import org.redisson.api.RSemaphore; import org.redisson.api.mapreduce.RMapReduce; import org.redisson.client.RedisClient; import org.redisson.client.codec.Codec; @@ -272,6 +275,26 @@ public class RedissonTransactionalMap extends RedissonMap { throw new UnsupportedOperationException("loadAll method is not supported in transaction"); } + @Override + public RLock getFairLock(K key) { + throw new UnsupportedOperationException("getFairLock method is not supported in transaction"); + } + + @Override + public RCountDownLatch getCountDownLatch(K key) { + throw new UnsupportedOperationException("getCountDownLatch method is not supported in transaction"); + } + + @Override + public RPermitExpirableSemaphore getPermitExpirableSemaphore(K key) { + throw new UnsupportedOperationException("getPermitExpirableSemaphore method is not supported in transaction"); + } + + @Override + public RSemaphore getSemaphore(K key) { + throw new UnsupportedOperationException("getSemaphore method is not supported in transaction"); + } + @Override public RLock getLock(K key) { throw new UnsupportedOperationException("getLock method is not supported in transaction"); diff --git a/redisson/src/main/java/org/redisson/transaction/RedissonTransactionalMapCache.java b/redisson/src/main/java/org/redisson/transaction/RedissonTransactionalMapCache.java index 225d2c04e..8a743cfa8 100644 --- a/redisson/src/main/java/org/redisson/transaction/RedissonTransactionalMapCache.java +++ b/redisson/src/main/java/org/redisson/transaction/RedissonTransactionalMapCache.java @@ -24,9 +24,12 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import org.redisson.RedissonMapCache; +import org.redisson.api.RCountDownLatch; import org.redisson.api.RFuture; import org.redisson.api.RLock; +import org.redisson.api.RPermitExpirableSemaphore; import org.redisson.api.RReadWriteLock; +import org.redisson.api.RSemaphore; import org.redisson.api.mapreduce.RMapReduce; import org.redisson.client.RedisClient; import org.redisson.client.codec.Codec; @@ -298,6 +301,26 @@ public class RedissonTransactionalMapCache extends RedissonMapCache throw new UnsupportedOperationException("loadAll method is not supported in transaction"); } + @Override + public RLock getFairLock(K key) { + throw new UnsupportedOperationException("getFairLock method is not supported in transaction"); + } + + @Override + public RCountDownLatch getCountDownLatch(K key) { + throw new UnsupportedOperationException("getCountDownLatch method is not supported in transaction"); + } + + @Override + public RPermitExpirableSemaphore getPermitExpirableSemaphore(K key) { + throw new UnsupportedOperationException("getPermitExpirableSemaphore method is not supported in transaction"); + } + + @Override + public RSemaphore getSemaphore(K key) { + throw new UnsupportedOperationException("getSemaphore method is not supported in transaction"); + } + @Override public RLock getLock(K key) { throw new UnsupportedOperationException("getLock method is not supported in transaction");