From 61a309f3a84ad39c7444176271f571edf132a453 Mon Sep 17 00:00:00 2001 From: Nikita Date: Tue, 27 Mar 2018 12:55:14 +0300 Subject: [PATCH 1/3] RSet.getLock method added --- .../main/java/org/redisson/RedissonSet.java | 30 +++++++++++++++-- .../redisson/RedissonSetMultimapValues.java | 33 +++++++++++++++++-- .../src/main/java/org/redisson/api/RSet.java | 8 +++++ 3 files changed, 66 insertions(+), 5 deletions(-) diff --git a/redisson/src/main/java/org/redisson/RedissonSet.java b/redisson/src/main/java/org/redisson/RedissonSet.java index 80f6c00ee..1f258957c 100644 --- a/redisson/src/main/java/org/redisson/RedissonSet.java +++ b/redisson/src/main/java/org/redisson/RedissonSet.java @@ -15,7 +15,6 @@ */ package org.redisson; -import java.net.InetSocketAddress; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -25,6 +24,7 @@ import java.util.List; import java.util.Set; import org.redisson.api.RFuture; +import org.redisson.api.RLock; import org.redisson.api.RSet; import org.redisson.api.RedissonClient; import org.redisson.api.SortOrder; @@ -37,8 +37,11 @@ import org.redisson.client.protocol.decoder.ListScanResult; import org.redisson.client.protocol.decoder.ScanObjectEntry; import org.redisson.command.CommandAsyncExecutor; import org.redisson.mapreduce.RedissonCollectionMapReduce; +import org.redisson.misc.Hash; import org.redisson.misc.RedissonPromise; +import io.netty.buffer.ByteBuf; + /** * Distributed and concurrent implementation of {@link java.util.Set} * @@ -216,12 +219,14 @@ public class RedissonSet extends RedissonExpirable implements RSet, ScanIt return RedissonPromise.newSucceededFuture(true); } + String tempName = suffixName(getName(), "redisson_temp"); + return commandExecutor.evalWriteAsync(getName(), codec, RedisCommands.EVAL_BOOLEAN, "redis.call('sadd', KEYS[2], unpack(ARGV)); " + "local size = redis.call('sdiff', KEYS[2], KEYS[1]);" + "redis.call('del', KEYS[2]); " + "return #size == 0 and 1 or 0; ", - Arrays.asList(getName(), "redisson_temp__{" + getName() + "}"), encode(c).toArray()); + Arrays.asList(getName(), tempName), encode(c).toArray()); } @Override @@ -251,13 +256,17 @@ public class RedissonSet extends RedissonExpirable implements RSet, ScanIt if (c.isEmpty()) { return deleteAsync(); } + + String tempName = suffixName(getName(), "redisson_temp"); + return commandExecutor.evalWriteAsync(getName(), codec, RedisCommands.EVAL_BOOLEAN, "redis.call('sadd', KEYS[2], unpack(ARGV)); " + "local prevSize = redis.call('scard', KEYS[1]); " + "local size = redis.call('sinterstore', KEYS[1], KEYS[1], KEYS[2]);" + "redis.call('del', KEYS[2]); " + "return size ~= prevSize and 1 or 0; ", - Arrays.asList(getName(), "redisson_temp__{" + getName() + "}"), encode(c).toArray()); + Arrays.asList(getName(), tempName), + encode(c).toArray()); } @Override @@ -541,5 +550,20 @@ public class RedissonSet extends RedissonExpirable implements RSet, ScanIt return commandExecutor.writeAsync(getName(), codec, RedisCommands.SORT_TO, params.toArray()); } + + private String getLockName(Object value) { + ByteBuf state = encode(value); + try { + return suffixName(getName(value), Hash.hash128toBase64(state) + ":lock"); + } finally { + state.release(); + } + } + + @Override + public RLock getLock(V value) { + String lockName = getLockName(value); + return new RedissonLock(commandExecutor, lockName); + } } diff --git a/redisson/src/main/java/org/redisson/RedissonSetMultimapValues.java b/redisson/src/main/java/org/redisson/RedissonSetMultimapValues.java index d0f954b02..5e509ba98 100644 --- a/redisson/src/main/java/org/redisson/RedissonSetMultimapValues.java +++ b/redisson/src/main/java/org/redisson/RedissonSetMultimapValues.java @@ -24,6 +24,7 @@ import java.util.Set; import java.util.concurrent.TimeUnit; import org.redisson.api.RFuture; +import org.redisson.api.RLock; import org.redisson.api.RSet; import org.redisson.api.SortOrder; import org.redisson.api.mapreduce.RCollectionMapReduce; @@ -103,6 +104,7 @@ public class RedissonSetMultimapValues extends RedissonExpirable implements R throw new UnsupportedOperationException("This operation is not supported for SetMultimap values Set"); } + @Override public RFuture deleteAsync() { return commandExecutor.evalWriteAsync(getName(), codec, RedisCommands.EVAL_BOOLEAN, "local expireDate = 92233720368547758; " + @@ -441,6 +443,11 @@ public class RedissonSetMultimapValues extends RedissonExpirable implements R Arrays.asList(timeoutSetName, getName()), args.toArray()); } + @Override + public RLock getLock(V value) { + return set.getLock(value); + } + @Override public boolean removeAll(Collection c) { return get(removeAllAsync(c)); @@ -529,106 +536,128 @@ public class RedissonSetMultimapValues extends RedissonExpirable implements R return commandExecutor.writeAsync(getName(), codec, RedisCommands.SINTER, args.toArray()); } + @Override public RFuture> readSortAsync(SortOrder order) { return set.readSortAsync(order); } + @Override public Set readSort(SortOrder order) { return set.readSort(order); } + @Override public RFuture> readSortAsync(SortOrder order, int offset, int count) { return set.readSortAsync(order, offset, count); } + @Override public Set readSort(SortOrder order, int offset, int count) { return set.readSort(order, offset, count); } + @Override public Set readSort(String byPattern, SortOrder order) { return set.readSort(byPattern, order); } + @Override public RFuture> readSortAsync(String byPattern, SortOrder order) { return set.readSortAsync(byPattern, order); } + @Override public Set readSort(String byPattern, SortOrder order, int offset, int count) { return set.readSort(byPattern, order, offset, count); } + @Override public RFuture> readSortAsync(String byPattern, SortOrder order, int offset, int count) { return set.readSortAsync(byPattern, order, offset, count); } + @Override public Collection readSort(String byPattern, List getPatterns, SortOrder order) { return set.readSort(byPattern, getPatterns, order); } + @Override public RFuture> readSortAsync(String byPattern, List getPatterns, SortOrder order) { return set.readSortAsync(byPattern, getPatterns, order); } + @Override public Collection readSort(String byPattern, List getPatterns, SortOrder order, int offset, int count) { return set.readSort(byPattern, getPatterns, order, offset, count); } + @Override public RFuture> readSortAsync(String byPattern, List getPatterns, SortOrder order, int offset, int count) { return set.readSortAsync(byPattern, getPatterns, order, offset, count); } + @Override public int sortTo(String destName, SortOrder order) { return set.sortTo(destName, order); } + @Override public RFuture sortToAsync(String destName, SortOrder order) { return set.sortToAsync(destName, order); } + @Override public int sortTo(String destName, SortOrder order, int offset, int count) { return set.sortTo(destName, order, offset, count); } + @Override public RFuture sortToAsync(String destName, SortOrder order, int offset, int count) { return set.sortToAsync(destName, order, offset, count); } + @Override public int sortTo(String destName, String byPattern, SortOrder order) { return set.sortTo(destName, byPattern, order); } + @Override public RFuture sortToAsync(String destName, String byPattern, SortOrder order) { return set.sortToAsync(destName, byPattern, order); } + @Override public int sortTo(String destName, String byPattern, SortOrder order, int offset, int count) { return set.sortTo(destName, byPattern, order, offset, count); } + @Override public RFuture sortToAsync(String destName, String byPattern, SortOrder order, int offset, int count) { return set.sortToAsync(destName, byPattern, order, offset, count); } + @Override public int sortTo(String destName, String byPattern, List getPatterns, SortOrder order) { return set.sortTo(destName, byPattern, getPatterns, order); } + @Override public RFuture sortToAsync(String destName, String byPattern, List getPatterns, SortOrder order) { return set.sortToAsync(destName, byPattern, getPatterns, order); } + @Override public int sortTo(String destName, String byPattern, List getPatterns, SortOrder order, int offset, int count) { return set.sortTo(destName, byPattern, getPatterns, order, offset, count); } + @Override public RFuture sortToAsync(String destName, String byPattern, List getPatterns, SortOrder order, int offset, int count) { return set.sortToAsync(destName, byPattern, getPatterns, order, offset, count); } - - } diff --git a/redisson/src/main/java/org/redisson/api/RSet.java b/redisson/src/main/java/org/redisson/api/RSet.java index fd0df0af1..ef1885424 100644 --- a/redisson/src/main/java/org/redisson/api/RSet.java +++ b/redisson/src/main/java/org/redisson/api/RSet.java @@ -29,6 +29,14 @@ import org.redisson.api.mapreduce.RCollectionMapReduce; */ public interface RSet extends Set, RExpirable, RSetAsync, RSortable> { + /** + * Returns lock instance associated with value + * + * @param value - set value + * @return lock + */ + RLock getLock(V value); + /** * Returns values iterator matches pattern. * From 1fa4b6ad5279c2052db8348e2a66b62e3aa5672d Mon Sep 17 00:00:00 2001 From: Nikita Date: Tue, 27 Mar 2018 12:58:04 +0300 Subject: [PATCH 2/3] refactoring --- redisson/src/main/java/org/redisson/RedissonMap.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/redisson/src/main/java/org/redisson/RedissonMap.java b/redisson/src/main/java/org/redisson/RedissonMap.java index 89d884458..26267b7bd 100644 --- a/redisson/src/main/java/org/redisson/RedissonMap.java +++ b/redisson/src/main/java/org/redisson/RedissonMap.java @@ -106,20 +106,20 @@ public class RedissonMap extends RedissonExpirable implements RMap { @Override public RLock getLock(K key) { - String lockName = getLockName(key); + String lockName = getLockName(key, "lock"); return new RedissonLock(commandExecutor, lockName); } @Override public RReadWriteLock getReadWriteLock(K key) { - String lockName = getLockName(key); + String lockName = getLockName(key, "rw_lock"); return new RedissonReadWriteLock(commandExecutor, lockName); } - private String getLockName(Object key) { + private String getLockName(Object key, String suffix) { ByteBuf keyState = encodeMapKey(key); try { - return suffixName(getName(), Hash.hash128toBase64(keyState) + ":key"); + return suffixName(getName(key), Hash.hash128toBase64(keyState) + ":" + suffix); } finally { keyState.release(); } From 4647447c4377cb4e87139aeb90547eb54490ac56 Mon Sep 17 00:00:00 2001 From: Nikita Date: Tue, 27 Mar 2018 12:58:21 +0300 Subject: [PATCH 3/3] subscriptionMode = MASTER by default --- .../org/redisson/config/BaseMasterSlaveServersConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/redisson/src/main/java/org/redisson/config/BaseMasterSlaveServersConfig.java b/redisson/src/main/java/org/redisson/config/BaseMasterSlaveServersConfig.java index ff606d632..47a9ea6d7 100644 --- a/redisson/src/main/java/org/redisson/config/BaseMasterSlaveServersConfig.java +++ b/redisson/src/main/java/org/redisson/config/BaseMasterSlaveServersConfig.java @@ -57,7 +57,7 @@ public class BaseMasterSlaveServersConfigeach slave node @@ -314,7 +314,7 @@ public class BaseMasterSlaveServersConfig - * Default is SLAVE + * Default is MASTER * * @param subscriptionMode param * @return config