diff --git a/src/main/java/org/springframework/data/redis/connection/DefaultStringRedisConnection.java b/src/main/java/org/springframework/data/redis/connection/DefaultStringRedisConnection.java index 2e279e5c3..0b8e96ac1 100644 --- a/src/main/java/org/springframework/data/redis/connection/DefaultStringRedisConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/DefaultStringRedisConnection.java @@ -452,6 +452,10 @@ public class DefaultStringRedisConnection implements StringRedisConnection { return delegate.sRandMember(key); } + public Set sRandMember(byte[] key, long count) { + return delegate.sRandMember(key, count); + } + public Boolean sRem(byte[] key, byte[] value) { return delegate.sRem(key, value); } @@ -1064,6 +1068,9 @@ public class DefaultStringRedisConnection implements StringRedisConnection { return deserialize(delegate.sRandMember(serialize(key))); } + public Set sRandMember(String key, long count) { + return deserialize(delegate.sRandMember(serialize(key), count)); + } public Boolean sRem(String key, String value) { return delegate.sRem(serialize(key), serialize(value)); diff --git a/src/main/java/org/springframework/data/redis/connection/RedisSetCommands.java b/src/main/java/org/springframework/data/redis/connection/RedisSetCommands.java index b84c136d2..f839dc773 100644 --- a/src/main/java/org/springframework/data/redis/connection/RedisSetCommands.java +++ b/src/main/java/org/springframework/data/redis/connection/RedisSetCommands.java @@ -52,4 +52,6 @@ public interface RedisSetCommands { Set sMembers(byte[] key); byte[] sRandMember(byte[] key); + + Set sRandMember(byte[] key, long count); } diff --git a/src/main/java/org/springframework/data/redis/connection/StringRedisConnection.java b/src/main/java/org/springframework/data/redis/connection/StringRedisConnection.java index da511fb97..274aef6d8 100644 --- a/src/main/java/org/springframework/data/redis/connection/StringRedisConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/StringRedisConnection.java @@ -187,6 +187,8 @@ public interface StringRedisConnection extends RedisConnection { String sRandMember(String key); + Set sRandMember(String key, long count); + Boolean zAdd(String key, double score, String value); Boolean zRem(String key, String value); diff --git a/src/main/java/org/springframework/data/redis/connection/jedis/JedisConnection.java b/src/main/java/org/springframework/data/redis/connection/jedis/JedisConnection.java index 4a8f64041..f633119e4 100644 --- a/src/main/java/org/springframework/data/redis/connection/jedis/JedisConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/jedis/JedisConnection.java @@ -1691,6 +1691,9 @@ public class JedisConnection implements RedisConnection { } } + public Set sRandMember(byte[] key, long count) { + throw new UnsupportedOperationException(); + } public Boolean sRem(byte[] key, byte[] value) { try { diff --git a/src/main/java/org/springframework/data/redis/connection/jredis/JredisConnection.java b/src/main/java/org/springframework/data/redis/connection/jredis/JredisConnection.java index 3a020b48c..9c3e1d0ab 100644 --- a/src/main/java/org/springframework/data/redis/connection/jredis/JredisConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/jredis/JredisConnection.java @@ -883,6 +883,11 @@ public class JredisConnection implements RedisConnection { } + public Set sRandMember(byte[] key, long count) { + throw new UnsupportedOperationException(); + } + + public Boolean sRem(byte[] key, byte[] value) { try { return jredis.srem(key, value); diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java index 4667417b5..164717480 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java @@ -1432,6 +1432,18 @@ public class LettuceConnection implements RedisConnection { } } + public Set sRandMember(byte[] key, long count) { + try { + if (isPipelined()) { + pipeline(getAsyncConnection().srandmember(key, count)); + return null; + } + return getConnection().srandmember(key, count); + } catch (Exception ex) { + throw convertLettuceAccessException(ex); + } + } + public Boolean sRem(byte[] key, byte[] value) { try { if (isPipelined()) { diff --git a/src/main/java/org/springframework/data/redis/connection/srp/SrpConnection.java b/src/main/java/org/springframework/data/redis/connection/srp/SrpConnection.java index 3b95aae7c..5959aa1c9 100644 --- a/src/main/java/org/springframework/data/redis/connection/srp/SrpConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/srp/SrpConnection.java @@ -42,6 +42,7 @@ import redis.Command; import redis.client.RedisClient; import redis.client.RedisClient.Pipeline; import redis.client.RedisException; +import redis.reply.MultiBulkReply; import redis.reply.Reply; import com.google.common.base.Charsets; @@ -1383,6 +1384,17 @@ public class SrpConnection implements RedisConnection { } } + public Set sRandMember(byte[] key, long count) { + try { + if (isPipelined()) { + pipeline(pipeline.srandmember(key, count)); + return null; + } + return SrpUtils.toSet(((MultiBulkReply)client.srandmember(key, count)).data()); + } catch (Exception ex) { + throw convertSrpAccessException(ex); + } + } public Boolean sRem(byte[] key, byte[] value) { try { diff --git a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java index 79b1dbf17..8c26dda3b 100644 --- a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java @@ -1166,6 +1166,41 @@ public abstract class AbstractConnectionIntegrationTests { .contains(connection.sRandMember("myset"))); } + @Test + public void testSRandMemberKeyNotExists() { + actual.add(connection.sRandMember("notexist")); + assertNull(convertResults().get(0)); + } + + @SuppressWarnings("rawtypes") + @Test + @IfProfileValue(name = "redisVersion", value = "2.6") + public void testSRandMemberCount() { + actual.add(connection.sAdd("myset", "foo")); + actual.add(connection.sAdd("myset", "bar")); + actual.add(connection.sAdd("myset", "baz")); + actual.add(connection.sRandMember("myset", 2)); + assertTrue(((Set)convertResults().get(3)).size() == 2); + } + + @SuppressWarnings("rawtypes") + @Test + @IfProfileValue(name = "redisVersion", value = "2.6") + public void testSRandMemberCountNegative() { + actual.add(connection.sAdd("myset", "foo")); + actual.add(connection.sRandMember("myset", -2)); + // APIs filter out duplicates so the negative has no effect + assertTrue(((Set)convertResults().get(1)).size() == 1); + } + + @SuppressWarnings("rawtypes") + @Test + @IfProfileValue(name = "redisVersion", value = "2.6") + public void testSRandMemberCountKeyNotExists() { + actual.add(connection.sRandMember("notexist", 2)); + assertTrue(((Set)convertResults().get(0)).isEmpty()); + } + @Test public void testSRem() { connection.sAdd("myset", "foo"); diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionIntegrationTests.java index 4e2303816..2a32a90fb 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionIntegrationTests.java @@ -158,6 +158,24 @@ public class JedisConnectionIntegrationTests extends AbstractConnectionIntegrati super.testIncrByDouble(); } + @Test(expected=UnsupportedOperationException.class) + @IfProfileValue(name = "redisVersion", value = "2.6") + public void testSRandMemberCount() { + super.testSRandMemberCount(); + } + + @Test(expected=UnsupportedOperationException.class) + @IfProfileValue(name = "redisVersion", value = "2.6") + public void testSRandMemberCountKeyNotExists() { + super.testSRandMemberCountKeyNotExists(); + } + + @Test(expected=UnsupportedOperationException.class) + @IfProfileValue(name = "redisVersion", value = "2.6") + public void testSRandMemberCountNegative() { + super.testSRandMemberCountNegative(); + } + @Test public void testIncrDecrByLong() { String key = "test.count"; diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionPipelineIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionPipelineIntegrationTests.java index 524d0e8c4..f2a3468c3 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionPipelineIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionPipelineIntegrationTests.java @@ -345,6 +345,24 @@ public class JedisConnectionPipelineIntegrationTests extends super.testScriptFlush(); } + @Test(expected=UnsupportedOperationException.class) + @IfProfileValue(name = "redisVersion", value = "2.6") + public void testSRandMemberCount() { + super.testSRandMemberCount(); + } + + @Test(expected=UnsupportedOperationException.class) + @IfProfileValue(name = "redisVersion", value = "2.6") + public void testSRandMemberCountKeyNotExists() { + super.testSRandMemberCountKeyNotExists(); + } + + @Test(expected=UnsupportedOperationException.class) + @IfProfileValue(name = "redisVersion", value = "2.6") + public void testSRandMemberCountNegative() { + super.testSRandMemberCountNegative(); + } + // Overrides, usually due to return values being Long vs Boolean or Set vs // List diff --git a/src/test/java/org/springframework/data/redis/connection/jredis/JRedisConnectionIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/jredis/JRedisConnectionIntegrationTests.java index 11041550b..de96cebb5 100644 --- a/src/test/java/org/springframework/data/redis/connection/jredis/JRedisConnectionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jredis/JRedisConnectionIntegrationTests.java @@ -495,6 +495,24 @@ public class JRedisConnectionIntegrationTests extends AbstractConnectionIntegrat super.testScriptFlush(); } + @Test(expected=UnsupportedOperationException.class) + @IfProfileValue(name = "redisVersion", value = "2.6") + public void testSRandMemberCount() { + super.testSRandMemberCount(); + } + + @Test(expected=UnsupportedOperationException.class) + @IfProfileValue(name = "redisVersion", value = "2.6") + public void testSRandMemberCountKeyNotExists() { + super.testSRandMemberCountKeyNotExists(); + } + + @Test(expected=UnsupportedOperationException.class) + @IfProfileValue(name = "redisVersion", value = "2.6") + public void testSRandMemberCountNegative() { + super.testSRandMemberCountNegative(); + } + // Jredis returns null for rPush @Test public void testSort() { diff --git a/src/test/java/org/springframework/data/redis/connection/srp/SrpConnectionPipelineIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/srp/SrpConnectionPipelineIntegrationTests.java index dc26c0788..142409422 100644 --- a/src/test/java/org/springframework/data/redis/connection/srp/SrpConnectionPipelineIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/srp/SrpConnectionPipelineIntegrationTests.java @@ -146,6 +146,27 @@ public class SrpConnectionPipelineIntegrationTests extends verifyResults(Arrays.asList(new Object[] { 1l, 1l, 1l, 0l }), actual); } + @Test + @IfProfileValue(name = "redisVersion", value = "2.6") + public void testSRandMemberCount() { + convertResultToSet = true; + super.testSRandMemberCount(); + } + + @Test + @IfProfileValue(name = "redisVersion", value = "2.6") + public void testSRandMemberCountKeyNotExists() { + convertResultToSet = true; + super.testSRandMemberCountKeyNotExists(); + } + + @Test + @IfProfileValue(name = "redisVersion", value = "2.6") + public void testSRandMemberCountNegative() { + convertResultToSet = true; + super.testSRandMemberCountNegative(); + } + @Test public void testZIncrBy() { actual.add(connection.zAdd("myset", 2, "Bob"));