diff --git a/src/main/java/redis/clients/jedis/BinaryClient.java b/src/main/java/redis/clients/jedis/BinaryClient.java index 39be157f08..84abee8e1e 100644 --- a/src/main/java/redis/clients/jedis/BinaryClient.java +++ b/src/main/java/redis/clients/jedis/BinaryClient.java @@ -503,6 +503,14 @@ public void zscore(final byte[] key, final byte[] member) { sendCommand(ZSCORE, key, member); } + public void zpopmin(final byte[] key) { + sendCommand(ZPOPMIN, key); + } + + public void zpopmin(final byte[] key, final long count) { + sendCommand(ZPOPMIN, key, toByteArray(count)); + } + public void multi() { sendCommand(MULTI); isInMulti = true; diff --git a/src/main/java/redis/clients/jedis/BinaryJedis.java b/src/main/java/redis/clients/jedis/BinaryJedis.java index 40bb8c2c45..1bfe8bbe3e 100644 --- a/src/main/java/redis/clients/jedis/BinaryJedis.java +++ b/src/main/java/redis/clients/jedis/BinaryJedis.java @@ -1841,6 +1841,20 @@ public Double zscore(final byte[] key, final byte[] member) { return (score != null ? new Double(score) : null); } + @Override + public Set zpopmin(final byte[] key) { + checkIsInMultiOrPipeline(); + client.zpopmin(key); + return getTupledSet(); + } + + @Override + public Set zpopmin(final byte[] key, final long count) { + checkIsInMultiOrPipeline(); + client.zpopmin(key, count); + return getTupledSet(); + } + public Transaction multi() { client.multi(); client.getOne(); // expected OK diff --git a/src/main/java/redis/clients/jedis/BinaryJedisCluster.java b/src/main/java/redis/clients/jedis/BinaryJedisCluster.java index 960499e14a..7fdf14ba1f 100644 --- a/src/main/java/redis/clients/jedis/BinaryJedisCluster.java +++ b/src/main/java/redis/clients/jedis/BinaryJedisCluster.java @@ -906,6 +906,26 @@ public Double execute(Jedis connection) { }.runBinary(key); } + @Override + public Set zpopmin(final byte[] key, final long count) { + return new JedisClusterCommand>(connectionHandler, maxAttempts) { + @Override + public Set execute(Jedis connection) { + return connection.zpopmin(key, count); + } + }.runBinary(key); + } + + @Override + public Set zpopmin(final byte[] key) { + return new JedisClusterCommand>(connectionHandler, maxAttempts) { + @Override + public Set execute(Jedis connection) { + return connection.zpopmin(key); + } + }.runBinary(key); + } + @Override public List sort(final byte[] key) { return new JedisClusterCommand>(connectionHandler, maxAttempts) { diff --git a/src/main/java/redis/clients/jedis/BinaryShardedJedis.java b/src/main/java/redis/clients/jedis/BinaryShardedJedis.java index 7d096c9b80..a805483183 100644 --- a/src/main/java/redis/clients/jedis/BinaryShardedJedis.java +++ b/src/main/java/redis/clients/jedis/BinaryShardedJedis.java @@ -534,6 +534,18 @@ public Double zscore(final byte[] key, final byte[] member) { return j.zscore(key, member); } + @Override + public Set zpopmin(final byte[] key) { + Jedis j = getShard(key); + return j.zpopmin(key); + } + + @Override + public Set zpopmin(final byte[] key, final long count) { + Jedis j = getShard(key); + return j.zpopmin(key, count); + } + @Override public List sort(final byte[] key) { Jedis j = getShard(key); diff --git a/src/main/java/redis/clients/jedis/Client.java b/src/main/java/redis/clients/jedis/Client.java index 20193fb911..6928d00ef2 100644 --- a/src/main/java/redis/clients/jedis/Client.java +++ b/src/main/java/redis/clients/jedis/Client.java @@ -465,6 +465,16 @@ public void zscore(final String key, final String member) { zscore(SafeEncoder.encode(key), SafeEncoder.encode(member)); } + @Override + public void zpopmin(final String key) { + zpopmin(SafeEncoder.encode(key)); + } + + @Override + public void zpopmin(final String key, final long count) { + zpopmin(SafeEncoder.encode(key), count); + } + @Override public void watch(final String... keys) { watch(SafeEncoder.encodeMany(keys)); diff --git a/src/main/java/redis/clients/jedis/Jedis.java b/src/main/java/redis/clients/jedis/Jedis.java index f32a4aab1e..dc53a30583 100644 --- a/src/main/java/redis/clients/jedis/Jedis.java +++ b/src/main/java/redis/clients/jedis/Jedis.java @@ -1673,6 +1673,20 @@ public Double zscore(final String key, final String member) { return BuilderFactory.DOUBLE.build(client.getOne()); } + @Override + public Set zpopmin(final String key) { + checkIsInMultiOrPipeline(); + client.zpopmin(key); + return getTupledSet(); + } + + @Override + public Set zpopmin(final String key, final long count) { + checkIsInMultiOrPipeline(); + client.zpopmin(key, count); + return getTupledSet(); + } + @Override public String watch(final String... keys) { client.watch(keys); diff --git a/src/main/java/redis/clients/jedis/PipelineBase.java b/src/main/java/redis/clients/jedis/PipelineBase.java index 8128346b54..e59d877845 100644 --- a/src/main/java/redis/clients/jedis/PipelineBase.java +++ b/src/main/java/redis/clients/jedis/PipelineBase.java @@ -1299,6 +1299,18 @@ public Response zscore(final byte[] key, final byte[] member) { return getResponse(BuilderFactory.DOUBLE); } + @Override + public Response> zpopmin(final String key) { + getClient(key).zpopmin(key); + return getResponse(BuilderFactory.TUPLE_ZSET); + } + + @Override + public Response> zpopmin(final String key, final long count) { + getClient(key).zpopmin(key, count); + return getResponse(BuilderFactory.TUPLE_ZSET); + } + @Override public Response zlexcount(final byte[] key, final byte[] min, final byte[] max) { getClient(key).zlexcount(key, min, max); diff --git a/src/main/java/redis/clients/jedis/Protocol.java b/src/main/java/redis/clients/jedis/Protocol.java index 130eb3f5c3..ffea7a2a6d 100644 --- a/src/main/java/redis/clients/jedis/Protocol.java +++ b/src/main/java/redis/clients/jedis/Protocol.java @@ -249,8 +249,8 @@ public static enum Command implements ProtocolCommand { HINCRBY, HEXISTS, HDEL, HLEN, HKEYS, HVALS, HGETALL, RPUSH, LPUSH, LLEN, LRANGE, LTRIM, LINDEX, LSET, LREM, LPOP, RPOP, RPOPLPUSH, SADD, SMEMBERS, SREM, SPOP, SMOVE, SCARD, SISMEMBER, SINTER, SINTERSTORE, SUNION, SUNIONSTORE, SDIFF, SDIFFSTORE, SRANDMEMBER, ZADD, ZRANGE, ZREM, ZINCRBY, - ZRANK, ZREVRANK, ZREVRANGE, ZCARD, ZSCORE, MULTI, DISCARD, EXEC, WATCH, UNWATCH, SORT, BLPOP, - BRPOP, AUTH, SUBSCRIBE, PUBLISH, UNSUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE, PUBSUB, ZCOUNT, + ZRANK, ZREVRANK, ZREVRANGE, ZCARD, ZSCORE, ZPOPMIN, MULTI, DISCARD, EXEC, WATCH, UNWATCH, SORT, + BLPOP, BRPOP, AUTH, SUBSCRIBE, PUBLISH, UNSUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE, PUBSUB, ZCOUNT, ZRANGEBYSCORE, ZREVRANGEBYSCORE, ZREMRANGEBYRANK, ZREMRANGEBYSCORE, ZUNIONSTORE, ZINTERSTORE, ZLEXCOUNT, ZRANGEBYLEX, ZREVRANGEBYLEX, ZREMRANGEBYLEX, SAVE, BGSAVE, BGREWRITEAOF, LASTSAVE, SHUTDOWN, INFO, MONITOR, SLAVEOF, CONFIG, STRLEN, SYNC, LPUSHX, PERSIST, RPUSHX, ECHO, LINSERT, diff --git a/src/main/java/redis/clients/jedis/ShardedJedis.java b/src/main/java/redis/clients/jedis/ShardedJedis.java index 7552563f8e..8f1319a9fc 100644 --- a/src/main/java/redis/clients/jedis/ShardedJedis.java +++ b/src/main/java/redis/clients/jedis/ShardedJedis.java @@ -572,6 +572,18 @@ public Double zscore(final String key, final String member) { return j.zscore(key, member); } + @Override + public Set zpopmin(final String key) { + Jedis j = getShard(key); + return j.zpopmin(key); + } + + @Override + public Set zpopmin(final String key, final long count) { + Jedis j = getShard(key); + return j.zpopmin(key, count); + } + @Override public List sort(final String key) { Jedis j = getShard(key); diff --git a/src/main/java/redis/clients/jedis/commands/BinaryJedisClusterCommands.java b/src/main/java/redis/clients/jedis/commands/BinaryJedisClusterCommands.java index bdf086b2ff..cadc4c2616 100644 --- a/src/main/java/redis/clients/jedis/commands/BinaryJedisClusterCommands.java +++ b/src/main/java/redis/clients/jedis/commands/BinaryJedisClusterCommands.java @@ -179,6 +179,10 @@ public interface BinaryJedisClusterCommands { Double zscore(byte[] key, byte[] member); + Set zpopmin(byte[] key); + + Set zpopmin(byte[] key, long count); + List sort(byte[] key); List sort(byte[] key, SortingParams sortingParameters); diff --git a/src/main/java/redis/clients/jedis/commands/BinaryJedisCommands.java b/src/main/java/redis/clients/jedis/commands/BinaryJedisCommands.java index cff42790c4..a71f164819 100644 --- a/src/main/java/redis/clients/jedis/commands/BinaryJedisCommands.java +++ b/src/main/java/redis/clients/jedis/commands/BinaryJedisCommands.java @@ -184,6 +184,10 @@ public interface BinaryJedisCommands { Double zscore(byte[] key, byte[] member); + Set zpopmin(byte[] key); + + Set zpopmin(byte[] key, long count); + List sort(byte[] key); List sort(byte[] key, SortingParams sortingParameters); diff --git a/src/main/java/redis/clients/jedis/commands/Commands.java b/src/main/java/redis/clients/jedis/commands/Commands.java index 1ca788908a..36af87239c 100644 --- a/src/main/java/redis/clients/jedis/commands/Commands.java +++ b/src/main/java/redis/clients/jedis/commands/Commands.java @@ -197,6 +197,10 @@ public interface Commands { void zscore(String key, String member); + void zpopmin(String key); + + void zpopmin(String key, long count); + void watch(String... keys); void sort(String key); diff --git a/src/main/java/redis/clients/jedis/commands/JedisCommands.java b/src/main/java/redis/clients/jedis/commands/JedisCommands.java index 9866cfce0f..c181049bda 100644 --- a/src/main/java/redis/clients/jedis/commands/JedisCommands.java +++ b/src/main/java/redis/clients/jedis/commands/JedisCommands.java @@ -187,6 +187,10 @@ public interface JedisCommands { Double zscore(String key, String member); + Set zpopmin(String key); + + Set zpopmin(String key, long count); + List sort(String key); List sort(String key, SortingParams sortingParameters); diff --git a/src/main/java/redis/clients/jedis/commands/RedisPipeline.java b/src/main/java/redis/clients/jedis/commands/RedisPipeline.java index 2155f4db09..f190d833d2 100644 --- a/src/main/java/redis/clients/jedis/commands/RedisPipeline.java +++ b/src/main/java/redis/clients/jedis/commands/RedisPipeline.java @@ -228,6 +228,10 @@ Response> zrevrangeByScoreWithScores(String key, String max, String m Response zscore(String key, String member); + Response> zpopmin(String key); + + Response> zpopmin(String key, long count); + Response zlexcount(String key, String min, String max); Response> zrangeByLex(String key, String min, String max); diff --git a/src/test/java/redis/clients/jedis/tests/commands/SortedSetCommandsTest.java b/src/test/java/redis/clients/jedis/tests/commands/SortedSetCommandsTest.java index 98bb4221f1..624af6d87d 100644 --- a/src/test/java/redis/clients/jedis/tests/commands/SortedSetCommandsTest.java +++ b/src/test/java/redis/clients/jedis/tests/commands/SortedSetCommandsTest.java @@ -544,6 +544,52 @@ public void zscore() { } @Test + public void zpopmin() { + + jedis.zadd("foo", 1d, "a",ZAddParams.zAddParams().nx()); + jedis.zadd("foo", 10d, "b",ZAddParams.zAddParams().nx()); + jedis.zadd("foo", 0.1d, "c",ZAddParams.zAddParams().nx()); + jedis.zadd("foo", 2d, "a",ZAddParams.zAddParams().nx()); + + Set range = jedis.zpopmin("foo", 2); + + Set expected = new LinkedHashSet(); + expected.add(new Tuple("c", 0.1d)); + expected.add(new Tuple("a", 1d)); + + assertEquals(expected, range); + + range = jedis.zpopmin("foo"); + + expected = new LinkedHashSet(); + expected.add(new Tuple("b", 10d)); + + assertEquals(expected, range); + + // Binary + + jedis.zadd(bfoo, 1d, ba); + jedis.zadd(bfoo, 10d, bb); + jedis.zadd(bfoo, 0.1d, bc); + jedis.zadd(bfoo, 2d, ba); + + Set brange = jedis.zpopmin(bfoo, 2); + + Set bexpected = new LinkedHashSet(); + bexpected.add(new Tuple(bc, 0.1d)); + bexpected.add(new Tuple(ba, 2d)); + + assertEquals(bexpected, brange); + + brange = jedis.zpopmin(bfoo); + + bexpected = new LinkedHashSet(); + bexpected.add(new Tuple(bb, 10d)); + + assertEquals(bexpected, brange); + } + + @Test public void zcount() { jedis.zadd("foo", 1d, "a"); jedis.zadd("foo", 10d, "b");