diff --git a/src/main/java/org/redisson/CommandExecutor.java b/src/main/java/org/redisson/CommandExecutor.java index a0d36f1b1..22fe5acea 100644 --- a/src/main/java/org/redisson/CommandExecutor.java +++ b/src/main/java/org/redisson/CommandExecutor.java @@ -17,7 +17,6 @@ package org.redisson; import java.util.Collection; import java.util.List; -import java.util.Queue; import org.redisson.client.codec.Codec; import org.redisson.client.protocol.RedisCommand; @@ -82,8 +81,8 @@ public interface CommandExecutor { V get(Future future); - Future readRandomAsync(RedisCommand command, Codec codec, Object ... params); + Future readRandomAsync(RedisCommand command, Object ... params); - R read(Integer slot, Codec codec, RedisCommand command, Object ... params); + R write(Integer slot, Codec codec, RedisCommand command, Object ... params); } diff --git a/src/main/java/org/redisson/CommandExecutorService.java b/src/main/java/org/redisson/CommandExecutorService.java index 51e4f700d..907b0ede8 100644 --- a/src/main/java/org/redisson/CommandExecutorService.java +++ b/src/main/java/org/redisson/CommandExecutorService.java @@ -103,15 +103,41 @@ public class CommandExecutorService implements CommandExecutor { return mainPromise; } - public Future readRandomAsync(RedisCommand command, Codec codec, Object ... params) { + public Future readRandomAsync(final RedisCommand command, final Object ... params) { final Promise mainPromise = connectionManager.newPromise(); - List slots = new ArrayList(connectionManager.getEntries().keySet()); + final List slots = new ArrayList(connectionManager.getEntries().keySet()); Collections.shuffle(slots); - Integer slot = slots.get(0); - async(true, slot, null, codec, command, params, mainPromise, 0); + + retryReadRandomAsync(command, mainPromise, slots, params); return mainPromise; } + private void retryReadRandomAsync(final RedisCommand command, final Promise mainPromise, + final List slots, final Object... params) { + final Promise attemptPromise = connectionManager.newPromise(); + attemptPromise.addListener(new FutureListener() { + @Override + public void operationComplete(Future future) throws Exception { + if (future.isSuccess()) { + if (future.getNow() == null) { + if (slots.isEmpty()) { + mainPromise.setSuccess(null); + } else { + retryReadRandomAsync(command, mainPromise, slots, params); + } + } else { + mainPromise.setSuccess(future.getNow()); + } + } else { + mainPromise.setFailure(future.cause()); + } + } + }); + + Integer slot = slots.remove(0); + async(true, slot, null, connectionManager.getCodec(), command, params, attemptPromise, 0); + } + public Future writeAllAsync(RedisCommand command, Object ... params) { return writeAllAsync(command, null, params); } @@ -177,14 +203,14 @@ public class CommandExecutorService implements CommandExecutor { return mainPromise; } - public R read(Integer slot, Codec codec, RedisCommand command, Object ... params) { - Future res = readAsync(slot, codec, command, params); + public R write(Integer slot, Codec codec, RedisCommand command, Object ... params) { + Future res = writeAsync(slot, codec, command, params); return get(res); } - public Future readAsync(Integer slot, Codec codec, RedisCommand command, Object ... params) { + public Future writeAsync(Integer slot, Codec codec, RedisCommand command, Object ... params) { Promise mainPromise = connectionManager.newPromise(); - async(true, slot, null, codec, command, params, mainPromise, 0); + async(false, slot, null, codec, command, params, mainPromise, 0); return mainPromise; } diff --git a/src/main/java/org/redisson/RedissonKeys.java b/src/main/java/org/redisson/RedissonKeys.java index 8b0bffe8b..09f449806 100644 --- a/src/main/java/org/redisson/RedissonKeys.java +++ b/src/main/java/org/redisson/RedissonKeys.java @@ -72,9 +72,9 @@ public class RedissonKeys implements RKeys { private ListScanResult scanIterator(int slot, long startPos, String pattern) { if (pattern == null) { - return commandExecutor.read(slot, StringCodec.INSTANCE, RedisCommands.SCAN, startPos); + return commandExecutor.write(slot, StringCodec.INSTANCE, RedisCommands.SCAN, startPos); } - return commandExecutor.read(slot, StringCodec.INSTANCE, RedisCommands.SCAN, startPos, "MATCH", pattern); + return commandExecutor.write(slot, StringCodec.INSTANCE, RedisCommands.SCAN, startPos, "MATCH", pattern); } private Iterator createKeysIterator(final int slot, final String pattern) { @@ -132,7 +132,7 @@ public class RedissonKeys implements RKeys { @Override public Future randomKeyAsync() { - return commandExecutor.readRandomAsync(RedisCommands.RANDOM_KEY, StringCodec.INSTANCE); + return commandExecutor.readRandomAsync(RedisCommands.RANDOM_KEY); } /** diff --git a/src/main/java/org/redisson/client/protocol/RedisCommands.java b/src/main/java/org/redisson/client/protocol/RedisCommands.java index 01dba3f17..80eaef1c4 100644 --- a/src/main/java/org/redisson/client/protocol/RedisCommands.java +++ b/src/main/java/org/redisson/client/protocol/RedisCommands.java @@ -43,8 +43,8 @@ import org.redisson.client.protocol.pubsub.PubSubStatusDecoder; public interface RedisCommands { - RedisCommand> SCAN = new RedisCommand>("SCAN", new NestedMultiDecoder(new ObjectListReplayDecoder(), new ListScanResultReplayDecoder()), ValueType.MAP); - RedisStrictCommand RANDOM_KEY = new RedisStrictCommand("RANDOMKEY"); + RedisCommand> SCAN = new RedisCommand>("SCAN", new NestedMultiDecoder(new ObjectListReplayDecoder(), new ListScanResultReplayDecoder()), ValueType.OBJECT); + RedisStrictCommand RANDOM_KEY = new RedisStrictCommand("RANDOMKEY", new StringDataDecoder()); RedisStrictCommand PING = new RedisStrictCommand("PING"); RedisStrictCommand UNWATCH = new RedisStrictCommand("UNWATCH", new VoidReplayConvertor()); @@ -58,7 +58,7 @@ public interface RedisCommands { RedisCommand SADD_SINGLE = new RedisCommand("SADD", new BooleanReplayConvertor(), 2); RedisCommand SREM_SINGLE = new RedisCommand("SREM", new BooleanReplayConvertor(), 2); RedisCommand> SMEMBERS = new RedisCommand>("SMEMBERS", new ObjectListReplayDecoder()); - RedisCommand> SSCAN = new RedisCommand>("SSCAN", new NestedMultiDecoder(new ObjectListReplayDecoder(), new ListScanResultReplayDecoder()), ValueType.MAP); + RedisCommand> SSCAN = new RedisCommand>("SSCAN", new NestedMultiDecoder(new ObjectListReplayDecoder(), new ListScanResultReplayDecoder()), ValueType.OBJECT); RedisCommand SISMEMBER = new RedisCommand("SISMEMBER", new BooleanReplayConvertor(), 2); RedisStrictCommand SCARD = new RedisStrictCommand("SCARD", new IntegerReplayConvertor()); @@ -152,6 +152,7 @@ public interface RedisCommands { RedisCommand PUNSUBSCRIBE = new RedisCommand("PUNSUBSCRIBE", new PubSubStatusDecoder()); RedisStrictCommand CLUSTER_NODES = new RedisStrictCommand("CLUSTER", "NODES", new StringDataDecoder()); + RedisStrictCommand CLUSTER_INFO = new RedisStrictCommand("CLUSTER", "INFO", new StringDataDecoder()); RedisStrictCommand> SENTINEL_GET_MASTER_ADDR_BY_NAME = new RedisStrictCommand>("SENTINEL", "GET-MASTER-ADDR-BY-NAME", new StringListReplayDecoder()); RedisStrictCommand>> SENTINEL_SLAVES = new RedisStrictCommand>>("SENTINEL", "SLAVES", new StringMapReplayDecoder()); diff --git a/src/test/java/org/redisson/RedissonBucketTest.java b/src/test/java/org/redisson/RedissonBucketTest.java index e52838059..ed7038dc1 100755 --- a/src/test/java/org/redisson/RedissonBucketTest.java +++ b/src/test/java/org/redisson/RedissonBucketTest.java @@ -25,41 +25,6 @@ public class RedissonBucketTest extends BaseTest { Assert.assertNull(bucket.get()); } - @Test - public void testDeleteByPattern() { - RBucket bucket = redisson.getBucket("test1"); - bucket.set("someValue"); - RMap map = redisson.getMap("test2"); - map.fastPut("1", "2"); - - Assert.assertEquals(2, redisson.deleteByPattern("test?")); - } - - @Test - public void testFindKeys() { - RBucket bucket = redisson.getBucket("test1"); - bucket.set("someValue"); - RMap map = redisson.getMap("test2"); - map.fastPut("1", "2"); - - Collection keys = redisson.findKeysByPattern("test?"); - MatcherAssert.assertThat(keys, Matchers.containsInAnyOrder("test1", "test2")); - - Collection keys2 = redisson.findKeysByPattern("test"); - MatcherAssert.assertThat(keys2, Matchers.empty()); - } - - @Test - public void testMassDelete() { - RBucket bucket = redisson.getBucket("test"); - bucket.set("someValue"); - RMap map = redisson.getMap("map2"); - map.fastPut("1", "2"); - - Assert.assertEquals(2, redisson.delete("test", "map2")); - Assert.assertEquals(0, redisson.delete("test", "map2")); - } - @Test public void testRenamenx() { RBucket bucket = redisson.getBucket("test");