From e41af15aeb329fdf1cba19783944598b870da299 Mon Sep 17 00:00:00 2001 From: dengliming Date: Thu, 18 Mar 2021 22:36:23 +0800 Subject: [PATCH 1/2] Add support for ZDIFF command --- .../redis/clients/jedis/BinaryClient.java | 12 ++++++++ .../java/redis/clients/jedis/BinaryJedis.java | 14 +++++++++ .../clients/jedis/BinaryJedisCluster.java | 20 +++++++++++++ src/main/java/redis/clients/jedis/Client.java | 10 +++++++ src/main/java/redis/clients/jedis/Jedis.java | 14 +++++++++ .../redis/clients/jedis/JedisCluster.java | 20 +++++++++++++ .../clients/jedis/MultiKeyPipelineBase.java | 24 +++++++++++++++ .../java/redis/clients/jedis/Protocol.java | 2 +- .../clients/jedis/commands/Commands.java | 4 +++ .../commands/MultiKeyBinaryCommands.java | 5 ++++ .../MultiKeyBinaryJedisClusterCommands.java | 5 ++++ .../commands/MultiKeyBinaryRedisPipeline.java | 5 ++++ .../jedis/commands/MultiKeyCommands.java | 5 ++++ .../commands/MultiKeyCommandsPipeline.java | 5 ++++ .../MultiKeyJedisClusterCommands.java | 7 ++++- .../tests/commands/SortedSetCommandsTest.java | 29 +++++++++++++++++++ 16 files changed, 179 insertions(+), 2 deletions(-) diff --git a/src/main/java/redis/clients/jedis/BinaryClient.java b/src/main/java/redis/clients/jedis/BinaryClient.java index b2cc3192dd..7159e7623c 100644 --- a/src/main/java/redis/clients/jedis/BinaryClient.java +++ b/src/main/java/redis/clients/jedis/BinaryClient.java @@ -574,6 +574,18 @@ public void zadd(final byte[] key, final Map scoreMembers, final sendCommand(ZADD, params.getByteParams(key, argsArray)); } + public void zdiff(final byte[]... keys) { + sendCommand(ZDIFF, joinParameters(toByteArray(keys.length), keys)); + } + + public void zdiffWithScores(final byte[]... keys) { + final List args = new ArrayList<>(keys.length + 2); + args.add(toByteArray(keys.length)); + Collections.addAll(args, keys); + args.add(WITHSCORES.getRaw()); + sendCommand(ZDIFF, args.toArray(new byte[args.size()][])); + } + public void zaddIncr(final byte[] key, final double score, final byte[] member, final ZAddParams params) { sendCommand(ZADD, params.getByteParams(key, INCR.getRaw(), toByteArray(score), member)); } diff --git a/src/main/java/redis/clients/jedis/BinaryJedis.java b/src/main/java/redis/clients/jedis/BinaryJedis.java index 3314549511..bfe18837b5 100644 --- a/src/main/java/redis/clients/jedis/BinaryJedis.java +++ b/src/main/java/redis/clients/jedis/BinaryJedis.java @@ -2623,6 +2623,20 @@ public Long zcount(final byte[] key, final byte[] min, final byte[] max) { return client.getIntegerReply(); } + @Override + public Set zdiff(final byte[]... keys) { + checkIsInMultiOrPipeline(); + client.zdiff(keys); + return SetFromList.of(client.getBinaryMultiBulkReply()); + } + + @Override + public Set zdiffWithScores(final byte[]... keys) { + checkIsInMultiOrPipeline(); + client.zdiffWithScores(keys); + return getTupledSet(); + } + /** * Return the all the elements in the sorted set at key with a score between min and max * (including elements with score equal to min or max). diff --git a/src/main/java/redis/clients/jedis/BinaryJedisCluster.java b/src/main/java/redis/clients/jedis/BinaryJedisCluster.java index 7649c34eb1..01734b6b1e 100644 --- a/src/main/java/redis/clients/jedis/BinaryJedisCluster.java +++ b/src/main/java/redis/clients/jedis/BinaryJedisCluster.java @@ -977,6 +977,26 @@ public Double execute(Jedis connection) { }.runBinary(key); } + @Override + public Set zdiff(final byte[]... keys) { + return new JedisClusterCommand>(connectionHandler, maxAttempts) { + @Override + public Set execute(Jedis connection) { + return connection.zdiff(keys); + } + }.runBinary(keys.length, keys); + } + + @Override + public Set zdiffWithScores(final byte[]... keys) { + return new JedisClusterCommand>(connectionHandler, maxAttempts) { + @Override + public Set execute(Jedis connection) { + return connection.zdiffWithScores(keys); + } + }.runBinary(keys.length, keys); + } + @Override public Set zrange(final byte[] key, final long start, final long stop) { return new JedisClusterCommand>(connectionHandler, maxAttempts) { diff --git a/src/main/java/redis/clients/jedis/Client.java b/src/main/java/redis/clients/jedis/Client.java index 295e7a09f8..ed08ded244 100644 --- a/src/main/java/redis/clients/jedis/Client.java +++ b/src/main/java/redis/clients/jedis/Client.java @@ -489,6 +489,16 @@ public void zaddIncr(final String key, final double score, final String member, zaddIncr(SafeEncoder.encode(key), score, SafeEncoder.encode(member), params); } + @Override + public void zdiff(final String... keys) { + zdiff(SafeEncoder.encodeMany(keys)); + } + + @Override + public void zdiffWithScores(final String... keys) { + zdiffWithScores(SafeEncoder.encodeMany(keys)); + } + @Override public void zrange(final String key, final long start, final long stop) { zrange(SafeEncoder.encode(key), start, stop); diff --git a/src/main/java/redis/clients/jedis/Jedis.java b/src/main/java/redis/clients/jedis/Jedis.java index fccb4f1040..79cf08b8ab 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 zaddIncr(final String key, final double score, final String member return BuilderFactory.DOUBLE.build(client.getOne()); } + @Override + public Set zdiff(String... keys) { + checkIsInMultiOrPipeline(); + client.zdiff(keys); + return SetFromList.of(client.getMultiBulkReply()); + } + + @Override + public Set zdiffWithScores(String... keys) { + checkIsInMultiOrPipeline(); + client.zdiffWithScores(keys); + return getTupledSet(); + } + @Override public Set zrange(final String key, final long start, final long stop) { checkIsInMultiOrPipeline(); diff --git a/src/main/java/redis/clients/jedis/JedisCluster.java b/src/main/java/redis/clients/jedis/JedisCluster.java index e271156b39..2c7d68a752 100644 --- a/src/main/java/redis/clients/jedis/JedisCluster.java +++ b/src/main/java/redis/clients/jedis/JedisCluster.java @@ -1079,6 +1079,26 @@ public Double execute(Jedis connection) { }.run(key); } + @Override + public Set zdiff(String... keys) { + return new JedisClusterCommand>(connectionHandler, maxAttempts) { + @Override + public Set execute(Jedis connection) { + return connection.zdiff(keys); + } + }.run(keys.length, keys); + } + + @Override + public Set zdiffWithScores(String... keys) { + return new JedisClusterCommand>(connectionHandler, maxAttempts) { + @Override + public Set execute(Jedis connection) { + return connection.zdiffWithScores(keys); + } + }.run(keys.length, keys); + } + @Override public Set zrange(final String key, final long start, final long stop) { return new JedisClusterCommand>(connectionHandler, maxAttempts) { diff --git a/src/main/java/redis/clients/jedis/MultiKeyPipelineBase.java b/src/main/java/redis/clients/jedis/MultiKeyPipelineBase.java index 1b5bf57368..da762f6dbd 100644 --- a/src/main/java/redis/clients/jedis/MultiKeyPipelineBase.java +++ b/src/main/java/redis/clients/jedis/MultiKeyPipelineBase.java @@ -337,6 +337,30 @@ public Response unwatch() { return getResponse(BuilderFactory.STRING); } + @Override + public Response> zdiff(byte[]... keys) { + client.zdiff(keys); + return getResponse(BuilderFactory.BYTE_ARRAY_ZSET); + } + + @Override + public Response> zdiffWithScores(byte[]... keys) { + client.zdiffWithScores(keys); + return getResponse(BuilderFactory.TUPLE_ZSET); + } + + @Override + public Response> zdiff(String... keys) { + client.zdiff(keys); + return getResponse(BuilderFactory.STRING_ZSET); + } + + @Override + public Response> zdiffWithScores(String... keys) { + client.zdiffWithScores(keys); + return getResponse(BuilderFactory.TUPLE_ZSET); + } + @Override public Response zinterstore(String dstkey, String... sets) { client.zinterstore(dstkey, sets); diff --git a/src/main/java/redis/clients/jedis/Protocol.java b/src/main/java/redis/clients/jedis/Protocol.java index 6c5c071b7b..70d77c7beb 100644 --- a/src/main/java/redis/clients/jedis/Protocol.java +++ b/src/main/java/redis/clients/jedis/Protocol.java @@ -249,7 +249,7 @@ public static enum Command implements ProtocolCommand { SETEX, MSET, MSETNX, DECRBY, DECR, INCRBY, INCR, APPEND, SUBSTR, HSET, HGET, HSETNX, HMSET, HMGET, HINCRBY, HEXISTS, HDEL, HLEN, HKEYS, HVALS, HGETALL, HRANDFIELD, 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, + SINTER, SINTERSTORE, SUNION, SUNIONSTORE, SDIFF, SDIFFSTORE, SRANDMEMBER, ZADD, ZDIFF, ZRANGE, ZREM, ZINCRBY, ZRANK, ZREVRANK, ZREVRANGE, ZRANDMEMBER, ZCARD, ZSCORE, ZPOPMAX, ZPOPMIN, MULTI, DISCARD, EXEC, WATCH, UNWATCH, SORT, BLPOP, BRPOP, AUTH, SUBSCRIBE, PUBLISH, UNSUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE, PUBSUB, ZCOUNT, ZRANGEBYSCORE, ZREVRANGEBYSCORE, ZREMRANGEBYRANK, diff --git a/src/main/java/redis/clients/jedis/commands/Commands.java b/src/main/java/redis/clients/jedis/commands/Commands.java index 0b33c23d00..ee06849445 100644 --- a/src/main/java/redis/clients/jedis/commands/Commands.java +++ b/src/main/java/redis/clients/jedis/commands/Commands.java @@ -209,6 +209,10 @@ default void setex(String key, int seconds, String value) { void sdiffstore(String dstkey, String... keys); + void zdiff(String... keys); + + void zdiffWithScores(String... keys); + void srandmember(String key); void zadd(String key, double score, String member); diff --git a/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryCommands.java b/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryCommands.java index e0bb0e18a0..7ed4324f27 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryCommands.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryCommands.java @@ -5,6 +5,7 @@ import redis.clients.jedis.GeoUnit; import redis.clients.jedis.KeyedTuple; import redis.clients.jedis.SortingParams; +import redis.clients.jedis.Tuple; import redis.clients.jedis.ZParams; import redis.clients.jedis.params.GeoRadiusParam; import redis.clients.jedis.params.GeoRadiusStoreParam; @@ -71,6 +72,10 @@ public interface MultiKeyBinaryCommands { String unwatch(); + Set zdiff(byte[]... keys); + + Set zdiffWithScores(byte[]... keys); + Long zinterstore(byte[] dstkey, byte[]... sets); Long zinterstore(byte[] dstkey, ZParams params, byte[]... sets); diff --git a/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryJedisClusterCommands.java b/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryJedisClusterCommands.java index a01ea228ca..72e0a7a218 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryJedisClusterCommands.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryJedisClusterCommands.java @@ -7,6 +7,7 @@ import redis.clients.jedis.ScanResult; import redis.clients.jedis.KeyedTuple; import redis.clients.jedis.SortingParams; +import redis.clients.jedis.Tuple; import redis.clients.jedis.ZParams; import redis.clients.jedis.params.GeoRadiusParam; import redis.clients.jedis.params.GeoRadiusStoreParam; @@ -63,6 +64,10 @@ public interface MultiKeyBinaryJedisClusterCommands { Long sunionstore(byte[] dstkey, byte[]... keys); + Set zdiff(byte[]... keys); + + Set zdiffWithScores(byte[]... keys); + Long zinterstore(byte[] dstkey, byte[]... sets); Long zinterstore(byte[] dstkey, ZParams params, byte[]... sets); diff --git a/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryRedisPipeline.java b/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryRedisPipeline.java index afb71445b9..7e641fc121 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryRedisPipeline.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryRedisPipeline.java @@ -5,6 +5,7 @@ import redis.clients.jedis.Response; import redis.clients.jedis.KeyedTuple; import redis.clients.jedis.SortingParams; +import redis.clients.jedis.Tuple; import redis.clients.jedis.ZParams; import redis.clients.jedis.params.*; @@ -67,6 +68,10 @@ public interface MultiKeyBinaryRedisPipeline { Response unwatch(); + Response> zdiff(byte[]... keys); + + Response> zdiffWithScores(byte[]... keys); + Response zinterstore(byte[] dstkey, byte[]... sets); Response zinterstore(byte[] dstkey, ZParams params, byte[]... sets); diff --git a/src/main/java/redis/clients/jedis/commands/MultiKeyCommands.java b/src/main/java/redis/clients/jedis/commands/MultiKeyCommands.java index aabf2d3612..aa66cad318 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyCommands.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyCommands.java @@ -9,6 +9,7 @@ import redis.clients.jedis.ScanResult; import redis.clients.jedis.SortingParams; import redis.clients.jedis.StreamEntry; +import redis.clients.jedis.Tuple; import redis.clients.jedis.ZParams; import redis.clients.jedis.params.GeoRadiusParam; import redis.clients.jedis.params.GeoRadiusStoreParam; @@ -103,6 +104,10 @@ public interface MultiKeyCommands { String unwatch(); + Set zdiff(String... keys); + + Set zdiffWithScores(String... keys); + Long zinterstore(String dstkey, String... sets); Long zinterstore(String dstkey, ZParams params, String... sets); diff --git a/src/main/java/redis/clients/jedis/commands/MultiKeyCommandsPipeline.java b/src/main/java/redis/clients/jedis/commands/MultiKeyCommandsPipeline.java index b12ca11ec4..98a543cd45 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyCommandsPipeline.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyCommandsPipeline.java @@ -7,6 +7,7 @@ import redis.clients.jedis.SortingParams; import redis.clients.jedis.StreamEntry; import redis.clients.jedis.StreamEntryID; +import redis.clients.jedis.Tuple; import redis.clients.jedis.ZParams; import redis.clients.jedis.params.*; @@ -68,6 +69,10 @@ public interface MultiKeyCommandsPipeline { Response unwatch(); + Response> zdiff(String... keys); + + Response> zdiffWithScores(String... keys); + Response zinterstore(String dstkey, String... sets); Response zinterstore(String dstkey, ZParams params, String... sets); diff --git a/src/main/java/redis/clients/jedis/commands/MultiKeyJedisClusterCommands.java b/src/main/java/redis/clients/jedis/commands/MultiKeyJedisClusterCommands.java index 7933a9ca50..f1721b9244 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyJedisClusterCommands.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyJedisClusterCommands.java @@ -9,6 +9,7 @@ import redis.clients.jedis.SortingParams; import redis.clients.jedis.StreamEntry; import redis.clients.jedis.StreamEntryID; +import redis.clients.jedis.Tuple; import redis.clients.jedis.ZParams; import redis.clients.jedis.params.GeoRadiusParam; import redis.clients.jedis.params.GeoRadiusStoreParam; @@ -65,6 +66,10 @@ public interface MultiKeyJedisClusterCommands { Long sunionstore(String dstkey, String... keys); + Set zdiff(String... keys); + + Set zdiffWithScores(String... keys); + Long zinterstore(String dstkey, String... sets); Long zinterstore(String dstkey, ZParams params, String... sets); @@ -115,7 +120,7 @@ List>> xread(int count, long block, List>> xread(XReadParams xReadParams, Map streams); - + /** * XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...] * 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 3519250a36..2eeca1e753 100644 --- a/src/test/java/redis/clients/jedis/tests/commands/SortedSetCommandsTest.java +++ b/src/test/java/redis/clients/jedis/tests/commands/SortedSetCommandsTest.java @@ -1445,6 +1445,35 @@ public void bzpopmin() { assertEquals(new KeyedTuple(bbar, bc, 0.1d), actual); } + @Test + public void zdiff() { + jedis.zadd("foo", 1.0, "a"); + jedis.zadd("foo", 2.0, "b"); + jedis.zadd("bar", 1.0, "a"); + + assertEquals(0, jedis.zdiff("bar1", "bar2").size()); + Set actual = jedis.zdiff("foo", "bar"); + assertEquals(1, actual.size()); + assertEquals("b", actual.iterator().next()); + Set actualWithScore = jedis.zdiffWithScores("foo", "bar"); + assertEquals(1, actualWithScore.size()); + assertEquals(new Tuple("b", 2.0d), actualWithScore.iterator().next()); + + // binary + + jedis.zadd(bfoo, 1.0, ba); + jedis.zadd(bfoo, 2.0, bb); + jedis.zadd(bbar, 1.0, ba); + + assertEquals(0, jedis.zdiff(bbar1, bbar2).size()); + Set bactual = jedis.zdiff(bfoo, bbar); + assertEquals(1, bactual.size()); + assertArrayEquals(bb, bactual.iterator().next()); + actualWithScore = jedis.zdiffWithScores(bfoo, bbar); + assertEquals(1, actualWithScore.size()); + assertEquals(new Tuple(bb, 2.0d), actualWithScore.iterator().next()); + } + @Test public void zrandmember() { assertNull(jedis.zrandmember("foo")); From 3f2914d13efc00de3138cdee7ece6bebb39546db Mon Sep 17 00:00:00 2001 From: dengliming Date: Thu, 18 Mar 2021 23:13:57 +0800 Subject: [PATCH 2/2] Fix review --- src/main/java/redis/clients/jedis/BinaryJedis.java | 2 +- .../jedis/tests/commands/SortedSetCommandsTest.java | 13 ++++--------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/main/java/redis/clients/jedis/BinaryJedis.java b/src/main/java/redis/clients/jedis/BinaryJedis.java index 33f8db8c79..493cf71866 100644 --- a/src/main/java/redis/clients/jedis/BinaryJedis.java +++ b/src/main/java/redis/clients/jedis/BinaryJedis.java @@ -2627,7 +2627,7 @@ public Long zcount(final byte[] key, final byte[] min, final byte[] max) { public Set zdiff(final byte[]... keys) { checkIsInMultiOrPipeline(); client.zdiff(keys); - return SetFromList.of(client.getBinaryMultiBulkReply()); + return BuilderFactory.BYTE_ARRAY_ZSET.build(client.getBinaryMultiBulkReply()); } @Override 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 2eeca1e753..bae188db0d 100644 --- a/src/test/java/redis/clients/jedis/tests/commands/SortedSetCommandsTest.java +++ b/src/test/java/redis/clients/jedis/tests/commands/SortedSetCommandsTest.java @@ -8,6 +8,7 @@ import static redis.clients.jedis.tests.utils.AssertUtil.assertCollectionContains; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashSet; @@ -1452,12 +1453,8 @@ public void zdiff() { jedis.zadd("bar", 1.0, "a"); assertEquals(0, jedis.zdiff("bar1", "bar2").size()); - Set actual = jedis.zdiff("foo", "bar"); - assertEquals(1, actual.size()); - assertEquals("b", actual.iterator().next()); - Set actualWithScore = jedis.zdiffWithScores("foo", "bar"); - assertEquals(1, actualWithScore.size()); - assertEquals(new Tuple("b", 2.0d), actualWithScore.iterator().next()); + assertEquals(Collections.singleton("b"), jedis.zdiff("foo", "bar")); + assertEquals(Collections.singleton(new Tuple("b", 2.0d)), jedis.zdiffWithScores("foo", "bar")); // binary @@ -1469,9 +1466,7 @@ public void zdiff() { Set bactual = jedis.zdiff(bfoo, bbar); assertEquals(1, bactual.size()); assertArrayEquals(bb, bactual.iterator().next()); - actualWithScore = jedis.zdiffWithScores(bfoo, bbar); - assertEquals(1, actualWithScore.size()); - assertEquals(new Tuple(bb, 2.0d), actualWithScore.iterator().next()); + assertEquals(Collections.singleton(new Tuple(bb, 2.0d)), jedis.zdiffWithScores(bfoo, bbar)); } @Test