diff --git a/src/main/java/org/redisson/Redisson.java b/src/main/java/org/redisson/Redisson.java old mode 100644 new mode 100755 index f90f42ebe..9d80b6206 --- a/src/main/java/org/redisson/Redisson.java +++ b/src/main/java/org/redisson/Redisson.java @@ -16,17 +16,14 @@ package org.redisson; import com.lambdaworks.redis.RedisAsyncConnection; - import io.netty.util.concurrent.Future; - import org.redisson.async.ResultOperation; -import org.redisson.connection.ClusterConnectionManager; -import org.redisson.connection.ConnectionManager; -import org.redisson.connection.MasterSlaveConnectionManager; -import org.redisson.connection.SentinelConnectionManager; -import org.redisson.connection.SingleConnectionManager; +import org.redisson.connection.*; import org.redisson.core.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import java.util.UUID; /** @@ -94,6 +91,30 @@ public class Redisson implements RedissonClient { return new RedissonBucket(connectionManager, name); } + /** + * Returns a list of object holder by a key pattern + */ + @Override + public List> getBuckets(final String pattern) { + List keys = connectionManager.get(connectionManager.readAsync(new ResultOperation, V>() { + @Override + public Future> execute(RedisAsyncConnection async) { + return async.keys(pattern); + } + })); + if (keys == null) { + return Collections.emptyList(); + } + List> buckets = new ArrayList>(keys.size()); + for (Object key : keys) { + if(key != null) { + buckets.add(this.getBucket(key.toString())); + } + } + return buckets; + } + + /** * Returns HyperLogLog object * diff --git a/src/main/java/org/redisson/RedissonClient.java b/src/main/java/org/redisson/RedissonClient.java old mode 100644 new mode 100755 index c30e5bd2e..e3dfc33ed --- a/src/main/java/org/redisson/RedissonClient.java +++ b/src/main/java/org/redisson/RedissonClient.java @@ -17,6 +17,8 @@ package org.redisson; import org.redisson.core.*; +import java.util.List; + public interface RedissonClient { /** @@ -27,6 +29,11 @@ public interface RedissonClient { */ RBucket getBucket(String name); + /** + * Returns a list of object holder by a key pattern + */ + List> getBuckets(String pattern); + /** * Returns HyperLogLog object * diff --git a/src/main/java/org/redisson/codec/JsonJacksonCodec.java b/src/main/java/org/redisson/codec/JsonJacksonCodec.java old mode 100644 new mode 100755 index 811abafff..ccf560c58 --- a/src/main/java/org/redisson/codec/JsonJacksonCodec.java +++ b/src/main/java/org/redisson/codec/JsonJacksonCodec.java @@ -94,7 +94,7 @@ public class JsonJacksonCodec implements RedissonCodec { @Override public Object decodeKey(ByteBuffer bytes) { - return new String(bytes.array(), Charset.forName("ASCII")); + return new String(bytes.array(), bytes.arrayOffset() + bytes.position(), bytes.limit(), Charset.forName("ASCII")); } @Override diff --git a/src/test/java/org/redisson/RedissonBucketTest.java b/src/test/java/org/redisson/RedissonBucketTest.java old mode 100644 new mode 100755 index fa5ee1e59..d05d0c15e --- a/src/test/java/org/redisson/RedissonBucketTest.java +++ b/src/test/java/org/redisson/RedissonBucketTest.java @@ -4,6 +4,10 @@ import org.junit.Assert; import org.junit.Test; import org.redisson.core.RBucket; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + public class RedissonBucketTest extends BaseTest { @Test @@ -52,4 +56,20 @@ public class RedissonBucketTest extends BaseTest { Assert.assertFalse(bucket.exists()); } + @Test + public void testGetPattern() { + Collection names = Arrays.asList("test:testGetPattern:one", "test:testGetPattern:two"); + Collection vals = Arrays.asList("one-val", "two-val"); + redisson.getBucket("test:testGetPattern:one").set("one-val"); + redisson.getBucket("test:testGetPattern:two").set("two-val"); + List> buckets = redisson.getBuckets("test:testGetPattern:*"); + Assert.assertEquals(2, buckets.size()); + Assert.assertTrue(names.contains(buckets.get(0).getName())); + Assert.assertTrue(names.contains(buckets.get(1).getName())); + Assert.assertTrue(vals.contains(buckets.get(0).get())); + Assert.assertTrue(vals.contains(buckets.get(1).get())); + for (RBucket bucket : buckets) { + bucket.delete(); + } + } }