diff --git a/src/main/java/redis/clients/jedis/BinaryClient.java b/src/main/java/redis/clients/jedis/BinaryClient.java index 692e18debf..a2bee50c70 100644 --- a/src/main/java/redis/clients/jedis/BinaryClient.java +++ b/src/main/java/redis/clients/jedis/BinaryClient.java @@ -599,6 +599,10 @@ public void zaddIncr(final byte[] key, final double score, final byte[] member, sendCommand(ZADD, params.getByteParams(key, INCR.getRaw(), toByteArray(score), member)); } + public void zdiffStore(final byte[] dstkey, final byte[]... keys) { + sendCommand(ZDIFFSTORE, joinParameters(dstkey, toByteArray(keys.length), keys)); + } + public void zrange(final byte[] key, final long start, final long stop) { sendCommand(ZRANGE, key, toByteArray(start), toByteArray(stop)); } diff --git a/src/main/java/redis/clients/jedis/BinaryJedis.java b/src/main/java/redis/clients/jedis/BinaryJedis.java index 2940bb9bfe..70121cde51 100644 --- a/src/main/java/redis/clients/jedis/BinaryJedis.java +++ b/src/main/java/redis/clients/jedis/BinaryJedis.java @@ -2655,6 +2655,13 @@ public Set zdiffWithScores(final byte[]... keys) { return getTupledSet(); } + @Override + public Long zdiffStore(final byte[] dstkey, final byte[]... keys) { + checkIsInMultiOrPipeline(); + client.zdiffStore(dstkey, keys); + return client.getIntegerReply(); + } + /** * 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 df86f83c35..4529c8358c 100644 --- a/src/main/java/redis/clients/jedis/BinaryJedisCluster.java +++ b/src/main/java/redis/clients/jedis/BinaryJedisCluster.java @@ -998,6 +998,17 @@ public Set execute(Jedis connection) { }.runBinary(keys.length, keys); } + @Override + public Long zdiffStore(final byte[] dstkey, final byte[]... keys) { + byte[][] wholeKeys = KeyMergeUtil.merge(dstkey, keys); + return new JedisClusterCommand(connectionHandler, maxAttempts) { + @Override + public Long execute(Jedis connection) { + return connection.zdiffStore(dstkey, keys); + } + }.runBinary(wholeKeys.length, wholeKeys); + } + @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 9ad4fb5bd1..ffc6c86146 100644 --- a/src/main/java/redis/clients/jedis/Client.java +++ b/src/main/java/redis/clients/jedis/Client.java @@ -666,6 +666,11 @@ public void zcount(final String key, final String min, final String max) { zcount(SafeEncoder.encode(key), SafeEncoder.encode(min), SafeEncoder.encode(max)); } + @Override + public void zdiffStore(final String dstkey, final String... keys) { + zdiffStore(SafeEncoder.encode(dstkey), SafeEncoder.encodeMany(keys)); + } + @Override public void zrangeByScore(final String key, final double min, final double max) { zrangeByScore(SafeEncoder.encode(key), toByteArray(min), toByteArray(max)); diff --git a/src/main/java/redis/clients/jedis/Jedis.java b/src/main/java/redis/clients/jedis/Jedis.java index 3dead829ce..23ecbbacd8 100644 --- a/src/main/java/redis/clients/jedis/Jedis.java +++ b/src/main/java/redis/clients/jedis/Jedis.java @@ -1687,6 +1687,13 @@ public Set zdiffWithScores(String... keys) { return getTupledSet(); } + @Override + public Long zdiffStore(final String dstkey, final String... keys) { + checkIsInMultiOrPipeline(); + client.zdiffStore(dstkey, keys); + return BuilderFactory.LONG.build(client.getOne()); + } + @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 1b1ec53147..ab5137f80d 100644 --- a/src/main/java/redis/clients/jedis/JedisCluster.java +++ b/src/main/java/redis/clients/jedis/JedisCluster.java @@ -1099,6 +1099,17 @@ public Set execute(Jedis connection) { }.run(keys.length, keys); } + @Override + public Long zdiffStore(final String dstkey, final String... keys) { + String[] wholeKeys = KeyMergeUtil.merge(dstkey, keys); + return new JedisClusterCommand(connectionHandler, maxAttempts) { + @Override + public Long execute(Jedis connection) { + return connection.zdiffStore(dstkey, keys); + } + }.run(wholeKeys.length, wholeKeys); + } + @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 8e1b1b9811..0e6e87e761 100644 --- a/src/main/java/redis/clients/jedis/MultiKeyPipelineBase.java +++ b/src/main/java/redis/clients/jedis/MultiKeyPipelineBase.java @@ -362,6 +362,18 @@ public Response> zdiffWithScores(String... keys) { return getResponse(BuilderFactory.TUPLE_ZSET); } + @Override + public Response zdiffStore(final byte[] dstkey, final byte[]... keys) { + client.zdiffStore(dstkey, keys); + return getResponse(BuilderFactory.LONG); + } + + @Override + public Response zdiffStore(final String dstkey, final String... keys) { + client.zdiffStore(dstkey, keys); + return getResponse(BuilderFactory.LONG); + } + @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 70d77c7beb..6c332d167e 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, ZDIFF, ZRANGE, ZREM, + SINTER, SINTERSTORE, SUNION, SUNIONSTORE, SDIFF, SDIFFSTORE, SRANDMEMBER, ZADD, ZDIFF, ZDIFFSTORE, 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 c49958abe6..e598ad9b81 100644 --- a/src/main/java/redis/clients/jedis/commands/Commands.java +++ b/src/main/java/redis/clients/jedis/commands/Commands.java @@ -225,6 +225,8 @@ default void setex(String key, int seconds, String value) { void zaddIncr(String key, double score, String member, ZAddParams params); + void zdiffStore(String dstkey, String... keys); + void zrange(String key, long start, long stop); void zrem(String key, String... members); diff --git a/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryCommands.java b/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryCommands.java index 7ed4324f27..f69f48c49e 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryCommands.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryCommands.java @@ -76,6 +76,8 @@ public interface MultiKeyBinaryCommands { Set zdiffWithScores(byte[]... keys); + Long zdiffStore(byte[] dstkey, 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 72e0a7a218..a45a3932d0 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryJedisClusterCommands.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryJedisClusterCommands.java @@ -68,6 +68,8 @@ public interface MultiKeyBinaryJedisClusterCommands { Set zdiffWithScores(byte[]... keys); + Long zdiffStore(byte[] dstkey, 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 7e641fc121..47d520a70d 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryRedisPipeline.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryRedisPipeline.java @@ -72,6 +72,8 @@ public interface MultiKeyBinaryRedisPipeline { Response> zdiffWithScores(byte[]... keys); + Response zdiffStore(byte[] dstkey, 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 aa66cad318..4a20e733b7 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyCommands.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyCommands.java @@ -108,6 +108,8 @@ public interface MultiKeyCommands { Set zdiffWithScores(String... keys); + Long zdiffStore(String dstkey, 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 98a543cd45..d59f2b7a22 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyCommandsPipeline.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyCommandsPipeline.java @@ -73,6 +73,8 @@ public interface MultiKeyCommandsPipeline { Response> zdiffWithScores(String... keys); + Response zdiffStore(String dstkey, 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 f1721b9244..426bba5239 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyJedisClusterCommands.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyJedisClusterCommands.java @@ -70,6 +70,8 @@ public interface MultiKeyJedisClusterCommands { Set zdiffWithScores(String... keys); + Long zdiffStore(String dstkey, String... keys); + Long zinterstore(String dstkey, String... sets); Long zinterstore(String dstkey, ZParams params, String... sets); 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 bae188db0d..2622cbf77b 100644 --- a/src/test/java/redis/clients/jedis/tests/commands/SortedSetCommandsTest.java +++ b/src/test/java/redis/clients/jedis/tests/commands/SortedSetCommandsTest.java @@ -1469,6 +1469,28 @@ public void zdiff() { assertEquals(Collections.singleton(new Tuple(bb, 2.0d)), jedis.zdiffWithScores(bfoo, bbar)); } + @Test + public void zdiffStore() { + jedis.zadd("foo", 1.0, "a"); + jedis.zadd("foo", 2.0, "b"); + jedis.zadd("bar", 1.0, "a"); + + assertEquals(0, jedis.zdiffStore("bar3", "bar1", "bar2").longValue()); + assertEquals(1, jedis.zdiffStore("bar3", "foo", "bar").longValue()); + assertEquals(Collections.singleton("b"), jedis.zrange("bar3", 0, -1)); + + // binary + + jedis.zadd(bfoo, 1.0, ba); + jedis.zadd(bfoo, 2.0, bb); + jedis.zadd(bbar, 1.0, ba); + + assertEquals(0, jedis.zdiffStore(bbar3, bbar1, bbar2).longValue()); + assertEquals(1, jedis.zdiffStore(bbar3, bfoo, bbar).longValue()); + Set bactual = jedis.zrange(bbar3, 0, -1); + assertArrayEquals(bb, bactual.iterator().next()); + } + @Test public void zrandmember() { assertNull(jedis.zrandmember("foo"));