From 577edd2470177b179cab31d29f7407a33261595f Mon Sep 17 00:00:00 2001 From: Nikita Date: Wed, 5 Aug 2015 13:43:52 +0300 Subject: [PATCH] RKeys.keysIterable by pattern added. #203 --- src/main/java/org/redisson/RedissonKeys.java | 29 +++++++++++++++---- src/main/java/org/redisson/core/RKeys.java | 22 ++++++++++++++ .../java/org/redisson/core/RKeysAsync.java | 5 ++++ 3 files changed, 50 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/redisson/RedissonKeys.java b/src/main/java/org/redisson/RedissonKeys.java index 9466ea9ad..8de5c096e 100644 --- a/src/main/java/org/redisson/RedissonKeys.java +++ b/src/main/java/org/redisson/RedissonKeys.java @@ -25,6 +25,20 @@ public class RedissonKeys implements RKeys { this.commandExecutor = commandExecutor; } + @Override + public Iterable keysIterable(final String pattern) { + List> iterables = new ArrayList>(); + for (final Integer slot : commandExecutor.getConnectionManager().getEntries().keySet()) { + Iterable iterable = new Iterable() { + @Override + public Iterator iterator() { + return createKeysIterator(slot, pattern); + } + }; + iterables.add(iterable); + } + return new CompositeIterable(iterables); + } @Override public Iterable keysIterable() { @@ -33,7 +47,7 @@ public class RedissonKeys implements RKeys { Iterable iterable = new Iterable() { @Override public Iterator iterator() { - return createKeysIterator(slot); + return createKeysIterator(slot, null); } }; iterables.add(iterable); @@ -41,11 +55,14 @@ public class RedissonKeys implements RKeys { return new CompositeIterable(iterables); } - private ListScanResult scanIterator(int slot, long startPos) { - return commandExecutor.read(slot, StringCodec.INSTANCE, RedisCommands.SCAN, startPos); + private ListScanResult scanIterator(int slot, long startPos, String pattern) { + if (pattern == null) { + return commandExecutor.read(slot, StringCodec.INSTANCE, RedisCommands.SCAN, startPos); + } + return commandExecutor.read(slot, StringCodec.INSTANCE, RedisCommands.SCAN, startPos, "MATCH", pattern); } - private Iterator createKeysIterator(final int slot) { + private Iterator createKeysIterator(final int slot, final String pattern) { return new Iterator() { private Iterator iter; @@ -57,11 +74,11 @@ public class RedissonKeys implements RKeys { @Override public boolean hasNext() { if (iter == null) { - ListScanResult res = scanIterator(slot, 0); + ListScanResult res = scanIterator(slot, 0, pattern); iter = res.getValues().iterator(); iterPos = res.getPos(); } else if (!iter.hasNext() && iterPos != 0) { - ListScanResult res = scanIterator(slot, iterPos); + ListScanResult res = scanIterator(slot, iterPos, pattern); iter = res.getValues().iterator(); iterPos = res.getPos(); } diff --git a/src/main/java/org/redisson/core/RKeys.java b/src/main/java/org/redisson/core/RKeys.java index 3e5bea07e..259931ec9 100644 --- a/src/main/java/org/redisson/core/RKeys.java +++ b/src/main/java/org/redisson/core/RKeys.java @@ -4,8 +4,30 @@ import java.util.Collection; public interface RKeys extends RKeysAsync { + /** + * Get keys by pattern using iterator. Keys traversing with SCAN operation + * + * Supported glob-style patterns: + * h?llo subscribes to hello, hallo and hxllo + * h*llo subscribes to hllo and heeeello + * h[ae]llo subscribes to hello and hallo, but not hillo + * + * @return + */ + Iterable keysIterable(String pattern); + + /** + * Get keys using iterator. Keys traversing with SCAN operation + * + * @return + */ Iterable keysIterable(); + /** + * Get random key + * + * @return + */ String randomKey(); /** diff --git a/src/main/java/org/redisson/core/RKeysAsync.java b/src/main/java/org/redisson/core/RKeysAsync.java index ce328acd1..396b192b9 100644 --- a/src/main/java/org/redisson/core/RKeysAsync.java +++ b/src/main/java/org/redisson/core/RKeysAsync.java @@ -6,6 +6,11 @@ import io.netty.util.concurrent.Future; public interface RKeysAsync { + /** + * Get random key in async mode + * + * @return + */ Future randomKeyAsync(); /**