From b4157688ff3662b5380d12b3b0afe475978034b2 Mon Sep 17 00:00:00 2001 From: dengliming Date: Sat, 13 Mar 2021 02:54:14 +0800 Subject: [PATCH 1/3] Add support for blocking zpopmax, zpopmin commands --- .../redis/clients/jedis/BinaryClient.java | 16 ++++++ .../java/redis/clients/jedis/BinaryJedis.java | 14 ++++++ .../clients/jedis/BinaryJedisCluster.java | 20 ++++++++ .../redis/clients/jedis/BuilderFactory.java | 18 +++++++ src/main/java/redis/clients/jedis/Client.java | 8 +++ 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 +- .../redis/clients/jedis/ScoreValueTuple.java | 50 +++++++++++++++++++ .../commands/MultiKeyBinaryCommands.java | 5 ++ .../MultiKeyBinaryJedisClusterCommands.java | 5 ++ .../commands/MultiKeyBinaryRedisPipeline.java | 5 ++ .../jedis/commands/MultiKeyCommands.java | 11 ++-- .../commands/MultiKeyCommandsPipeline.java | 5 ++ .../MultiKeyJedisClusterCommands.java | 5 ++ .../tests/commands/SortedSetCommandsTest.java | 39 +++++++++++++++ 17 files changed, 257 insertions(+), 4 deletions(-) create mode 100644 src/main/java/redis/clients/jedis/ScoreValueTuple.java diff --git a/src/main/java/redis/clients/jedis/BinaryClient.java b/src/main/java/redis/clients/jedis/BinaryClient.java index f5ca153207..aa4d8e58fd 100644 --- a/src/main/java/redis/clients/jedis/BinaryClient.java +++ b/src/main/java/redis/clients/jedis/BinaryClient.java @@ -692,6 +692,22 @@ public void blpop(final int timeout, final byte[]... keys) { blpop(args.toArray(new byte[args.size()][])); } + public void bzpopmax(final int timeout, final byte[]... keys) { + final List args = new ArrayList<>(); + Collections.addAll(args, keys); + + args.add(Protocol.toByteArray(timeout)); + sendCommand(BZPOPMAX, args.toArray(new byte[args.size()][])); + } + + public void bzpopmin(final int timeout, final byte[]... keys) { + final List args = new ArrayList<>(); + Collections.addAll(args, keys); + + args.add(Protocol.toByteArray(timeout)); + sendCommand(BZPOPMIN, args.toArray(new byte[args.size()][])); + } + public void sort(final byte[] key, final SortingParams sortingParameters, final byte[] dstkey) { final List args = new ArrayList<>(); args.add(key); diff --git a/src/main/java/redis/clients/jedis/BinaryJedis.java b/src/main/java/redis/clients/jedis/BinaryJedis.java index ffe4c02460..ff10f6eb72 100644 --- a/src/main/java/redis/clients/jedis/BinaryJedis.java +++ b/src/main/java/redis/clients/jedis/BinaryJedis.java @@ -2363,6 +2363,20 @@ public List blpop(final int timeout, final byte[]... keys) { return blpop(getArgsAddTimeout(timeout, keys)); } + @Override + public ScoreValueTuple bzpopmax(final int timeout, final byte[]... keys) { + checkIsInMultiOrPipeline(); + client.bzpopmax(timeout, keys); + return BuilderFactory.SCORE_VALUE_TUPLE.build(client.getBinaryMultiBulkReply()); + } + + @Override + public ScoreValueTuple bzpopmin(final int timeout, final byte[]... keys) { + checkIsInMultiOrPipeline(); + client.bzpopmin(timeout, keys); + return BuilderFactory.SCORE_VALUE_TUPLE.build(client.getBinaryMultiBulkReply()); + } + private byte[][] getArgsAddTimeout(int timeout, byte[][] keys) { int size = keys.length; final byte[][] args = new byte[size + 1][]; diff --git a/src/main/java/redis/clients/jedis/BinaryJedisCluster.java b/src/main/java/redis/clients/jedis/BinaryJedisCluster.java index 389d20384d..605a47dccb 100644 --- a/src/main/java/redis/clients/jedis/BinaryJedisCluster.java +++ b/src/main/java/redis/clients/jedis/BinaryJedisCluster.java @@ -1666,6 +1666,26 @@ public List execute(Jedis connection) { }.runBinary(keys.length, keys); } + @Override + public ScoreValueTuple bzpopmax(int timeout, byte[]... keys) { + return new JedisClusterCommand(connectionHandler, maxAttempts) { + @Override + public ScoreValueTuple execute(Jedis connection) { + return connection.bzpopmax(timeout, keys); + } + }.runBinary(keys.length, keys); + } + + @Override + public ScoreValueTuple bzpopmin(int timeout, byte[]... keys) { + return new JedisClusterCommand(connectionHandler, maxAttempts) { + @Override + public ScoreValueTuple execute(Jedis connection) { + return connection.bzpopmin(timeout, keys); + } + }.runBinary(keys.length, keys); + } + @Override public List brpop(final int timeout, final byte[]... keys) { return new JedisClusterCommand>(connectionHandler, maxAttempts) { diff --git a/src/main/java/redis/clients/jedis/BuilderFactory.java b/src/main/java/redis/clients/jedis/BuilderFactory.java index 8a202ec062..e4867c00a8 100644 --- a/src/main/java/redis/clients/jedis/BuilderFactory.java +++ b/src/main/java/redis/clients/jedis/BuilderFactory.java @@ -326,6 +326,24 @@ public String toString() { }; + public static final Builder SCORE_VALUE_TUPLE = new Builder() { + @Override + @SuppressWarnings("unchecked") + public ScoreValueTuple build(Object data) { + List l = (List) data; // never null + if (l.isEmpty()) { + return null; + } + return new ScoreValueTuple(l.get(0), l.get(1), DOUBLE.build(l.get(2))); + } + + @Override + public String toString() { + return "ScoreValueTuple"; + } + + }; + public static final Builder EVAL_RESULT = new Builder() { @Override diff --git a/src/main/java/redis/clients/jedis/Client.java b/src/main/java/redis/clients/jedis/Client.java index 5ade2cff2a..0cc93e5214 100644 --- a/src/main/java/redis/clients/jedis/Client.java +++ b/src/main/java/redis/clients/jedis/Client.java @@ -592,6 +592,14 @@ public void blpop(final int timeout, final String... keys) { blpop(args.toArray(new String[size])); } + public void bzpopmax(final int timeout, final String... keys) { + bzpopmax(timeout, SafeEncoder.encodeMany(keys)); + } + + public void bzpopmin(final int timeout, final String... keys) { + bzpopmin(timeout, SafeEncoder.encodeMany(keys)); + } + @Override public void sort(final String key, final SortingParams sortingParameters, final String dstkey) { sort(SafeEncoder.encode(key), sortingParameters, SafeEncoder.encode(dstkey)); diff --git a/src/main/java/redis/clients/jedis/Jedis.java b/src/main/java/redis/clients/jedis/Jedis.java index 24ad5cf8d6..e51bddb9db 100644 --- a/src/main/java/redis/clients/jedis/Jedis.java +++ b/src/main/java/redis/clients/jedis/Jedis.java @@ -2024,6 +2024,20 @@ public List blpop(final int timeout, final String... keys) { return blpop(getArgsAddTimeout(timeout, keys)); } + @Override + public ScoreValueTuple bzpopmax(int timeout, String... keys) { + checkIsInMultiOrPipeline(); + client.bzpopmax(timeout, keys); + return BuilderFactory.SCORE_VALUE_TUPLE.build(client.getObjectMultiBulkReply()); + } + + @Override + public ScoreValueTuple bzpopmin(int timeout, String... keys) { + checkIsInMultiOrPipeline(); + client.bzpopmin(timeout, keys); + return BuilderFactory.SCORE_VALUE_TUPLE.build(client.getObjectMultiBulkReply()); + } + private String[] getArgsAddTimeout(int timeout, String[] keys) { final int keyCount = keys.length; final String[] args = new String[keyCount + 1]; diff --git a/src/main/java/redis/clients/jedis/JedisCluster.java b/src/main/java/redis/clients/jedis/JedisCluster.java index e0258c6ba7..ad425117b5 100644 --- a/src/main/java/redis/clients/jedis/JedisCluster.java +++ b/src/main/java/redis/clients/jedis/JedisCluster.java @@ -1756,6 +1756,26 @@ public List execute(Jedis connection) { }.run(keys.length, keys); } + @Override + public ScoreValueTuple bzpopmax(int timeout, String... keys) { + return new JedisClusterCommand(connectionHandler, maxAttempts) { + @Override + public ScoreValueTuple execute(Jedis connection) { + return connection.bzpopmax(timeout, keys); + } + }.run(keys.length, keys); + } + + @Override + public ScoreValueTuple bzpopmin(int timeout, String... keys) { + return new JedisClusterCommand(connectionHandler, maxAttempts) { + @Override + public ScoreValueTuple execute(Jedis connection) { + return connection.bzpopmin(timeout, keys); + } + }.run(keys.length, keys); + } + @Override public List mget(final String... keys) { 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 bcaaf9ef54..9b134bcbc6 100644 --- a/src/main/java/redis/clients/jedis/MultiKeyPipelineBase.java +++ b/src/main/java/redis/clients/jedis/MultiKeyPipelineBase.java @@ -69,6 +69,30 @@ public Response> blpop(int timeout, byte[]... keys) { return getResponse(BuilderFactory.STRING_LIST); } + @Override + public Response bzpopmax(int timeout, String... keys) { + client.bzpopmax(timeout, keys); + return getResponse(BuilderFactory.SCORE_VALUE_TUPLE); + } + + @Override + public Response bzpopmin(int timeout, String... keys) { + client.bzpopmin(timeout, keys); + return getResponse(BuilderFactory.SCORE_VALUE_TUPLE); + } + + @Override + public Response bzpopmax(int timeout, byte[]... keys) { + client.bzpopmax(timeout, keys); + return getResponse(BuilderFactory.SCORE_VALUE_TUPLE); + } + + @Override + public Response bzpopmin(int timeout, byte[]... keys) { + client.bzpopmin(timeout, keys); + return getResponse(BuilderFactory.SCORE_VALUE_TUPLE); + } + @Override public Response del(String... keys) { client.del(keys); diff --git a/src/main/java/redis/clients/jedis/Protocol.java b/src/main/java/redis/clients/jedis/Protocol.java index 1b21762f7c..4eb08b19b0 100644 --- a/src/main/java/redis/clients/jedis/Protocol.java +++ b/src/main/java/redis/clients/jedis/Protocol.java @@ -261,7 +261,7 @@ public static enum Command implements ProtocolCommand { READONLY, GEOADD, GEODIST, GEOHASH, GEOPOS, GEORADIUS, GEORADIUS_RO, GEORADIUSBYMEMBER, GEORADIUSBYMEMBER_RO, MODULE, BITFIELD, HSTRLEN, TOUCH, SWAPDB, MEMORY, XADD, XLEN, XDEL, XTRIM, XRANGE, XREVRANGE, XREAD, XACK, XGROUP, XREADGROUP, XPENDING, XCLAIM, ACL, XINFO, - BITFIELD_RO, LPOS, SMISMEMBER, ZMSCORE; + BITFIELD_RO, LPOS, SMISMEMBER, ZMSCORE, BZPOPMIN, BZPOPMAX; private final byte[] raw; diff --git a/src/main/java/redis/clients/jedis/ScoreValueTuple.java b/src/main/java/redis/clients/jedis/ScoreValueTuple.java new file mode 100644 index 0000000000..a658ba6947 --- /dev/null +++ b/src/main/java/redis/clients/jedis/ScoreValueTuple.java @@ -0,0 +1,50 @@ +package redis.clients.jedis; + +import redis.clients.jedis.util.SafeEncoder; + +import java.util.Arrays; + +public class ScoreValueTuple extends Tuple { + private byte[] key; + + public ScoreValueTuple(byte[] key, byte[] element, Double score) { + super(element, score); + this.key = key; + } + + public ScoreValueTuple(String key, String element, Double score) { + super(element, score); + this.key = SafeEncoder.encode(key); + } + + public String getKey() { + if (null != key) { + return SafeEncoder.encode(key); + } + return null; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ScoreValueTuple)) return false; + if (!super.equals(o)) return false; + + ScoreValueTuple that = (ScoreValueTuple) o; + return Arrays.equals(key, that.key); + } + + @Override + public int hashCode() { + int result = super.hashCode(); + result = 31 * result + (key != null ? Arrays.hashCode(key) : 0); + return result; + } + + @Override + public String toString() { + return "ScoreValueTuple{" + + "key=" + SafeEncoder.encode(key) + + "} " + super.toString(); + } +} diff --git a/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryCommands.java b/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryCommands.java index 08bc6cd401..1b04eca9d8 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryCommands.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryCommands.java @@ -3,6 +3,7 @@ import redis.clients.jedis.BinaryJedisPubSub; import redis.clients.jedis.BitOP; import redis.clients.jedis.GeoUnit; +import redis.clients.jedis.ScoreValueTuple; import redis.clients.jedis.SortingParams; import redis.clients.jedis.ZParams; import redis.clients.jedis.params.GeoRadiusParam; @@ -27,6 +28,10 @@ public interface MultiKeyBinaryCommands { List brpop(byte[]... args); + ScoreValueTuple bzpopmax(int timeout, byte[]... keys); + + ScoreValueTuple bzpopmin(int timeout, byte[]... keys); + Set keys(byte[] pattern); List mget(byte[]... keys); diff --git a/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryJedisClusterCommands.java b/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryJedisClusterCommands.java index f50acf60da..0229181cd5 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryJedisClusterCommands.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryJedisClusterCommands.java @@ -5,6 +5,7 @@ import redis.clients.jedis.GeoUnit; import redis.clients.jedis.ScanParams; import redis.clients.jedis.ScanResult; +import redis.clients.jedis.ScoreValueTuple; import redis.clients.jedis.SortingParams; import redis.clients.jedis.ZParams; import redis.clients.jedis.params.GeoRadiusParam; @@ -25,6 +26,10 @@ public interface MultiKeyBinaryJedisClusterCommands { List brpop(int timeout, byte[]... keys); + ScoreValueTuple bzpopmax(int timeout, byte[]... keys); + + ScoreValueTuple bzpopmin(int timeout, byte[]... keys); + List mget(byte[]... keys); String mset(byte[]... keysvalues); diff --git a/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryRedisPipeline.java b/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryRedisPipeline.java index 83a6e03923..caea5a6078 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryRedisPipeline.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryRedisPipeline.java @@ -3,6 +3,7 @@ import redis.clients.jedis.BitOP; import redis.clients.jedis.GeoUnit; import redis.clients.jedis.Response; +import redis.clients.jedis.ScoreValueTuple; import redis.clients.jedis.SortingParams; import redis.clients.jedis.ZParams; import redis.clients.jedis.params.GeoRadiusParam; @@ -27,6 +28,10 @@ public interface MultiKeyBinaryRedisPipeline { Response> brpop(byte[]... args); + Response bzpopmax(int timeout, byte[]... keys); + + Response bzpopmin(int timeout, byte[]... keys); + Response> keys(byte[] pattern); Response> mget(byte[]... keys); diff --git a/src/main/java/redis/clients/jedis/commands/MultiKeyCommands.java b/src/main/java/redis/clients/jedis/commands/MultiKeyCommands.java index 42cd8939de..fb0679ece0 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyCommands.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyCommands.java @@ -2,6 +2,7 @@ import redis.clients.jedis.BitOP; import redis.clients.jedis.GeoUnit; +import redis.clients.jedis.ScoreValueTuple; import redis.clients.jedis.StreamEntryID; import redis.clients.jedis.JedisPubSub; import redis.clients.jedis.ScanParams; @@ -31,6 +32,10 @@ public interface MultiKeyCommands { List brpop(String... args); + ScoreValueTuple bzpopmax(int timeout, String... keys); + + ScoreValueTuple bzpopmin(int timeout, String... keys); + /** * Returns all the keys matching the glob-style pattern. For example if you have in the database * the keys "foo" and "foobar" the command "KEYS foo*" will return "foo foobar".
@@ -118,7 +123,7 @@ public interface MultiKeyCommands { /** * @see #scan(String, ScanParams) - * + * * @param cursor * @return */ @@ -178,7 +183,7 @@ public interface MultiKeyCommands { /** * XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...] - * + * * @param count * @param block * @param streams @@ -189,7 +194,7 @@ List>> xread(int count, long block, /** * XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...] - * + * * @param groupname * @param consumer * @param count diff --git a/src/main/java/redis/clients/jedis/commands/MultiKeyCommandsPipeline.java b/src/main/java/redis/clients/jedis/commands/MultiKeyCommandsPipeline.java index b457340708..44fa2d527c 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyCommandsPipeline.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyCommandsPipeline.java @@ -3,6 +3,7 @@ import redis.clients.jedis.BitOP; import redis.clients.jedis.GeoUnit; import redis.clients.jedis.Response; +import redis.clients.jedis.ScoreValueTuple; import redis.clients.jedis.SortingParams; import redis.clients.jedis.ZParams; import redis.clients.jedis.params.GeoRadiusParam; @@ -26,6 +27,10 @@ public interface MultiKeyCommandsPipeline { Response> brpop(String... args); + Response bzpopmax(int timeout, String... keys); + + Response bzpopmin(int timeout, String... keys); + Response> keys(String pattern); Response> mget(String... keys); diff --git a/src/main/java/redis/clients/jedis/commands/MultiKeyJedisClusterCommands.java b/src/main/java/redis/clients/jedis/commands/MultiKeyJedisClusterCommands.java index bcac6ec0dd..655acbe6b3 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyJedisClusterCommands.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyJedisClusterCommands.java @@ -5,6 +5,7 @@ import redis.clients.jedis.JedisPubSub; import redis.clients.jedis.ScanParams; import redis.clients.jedis.ScanResult; +import redis.clients.jedis.ScoreValueTuple; import redis.clients.jedis.SortingParams; import redis.clients.jedis.StreamEntry; import redis.clients.jedis.StreamEntryID; @@ -28,6 +29,10 @@ public interface MultiKeyJedisClusterCommands { List brpop(int timeout, String... keys); + ScoreValueTuple bzpopmax(int timeout, String... keys); + + ScoreValueTuple bzpopmin(int timeout, String... keys); + List mget(String... keys); String mset(String... keysvalues); 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 81763c0551..1f5340f99a 100644 --- a/src/test/java/redis/clients/jedis/tests/commands/SortedSetCommandsTest.java +++ b/src/test/java/redis/clients/jedis/tests/commands/SortedSetCommandsTest.java @@ -19,6 +19,7 @@ import redis.clients.jedis.ScanParams; import redis.clients.jedis.ScanResult; +import redis.clients.jedis.ScoreValueTuple; import redis.clients.jedis.Tuple; import redis.clients.jedis.ZParams; import redis.clients.jedis.params.ZAddParams; @@ -1412,4 +1413,42 @@ public void infinity() { assertEquals(0d, itr.next().getScore(), 0d); assertEquals(Double.POSITIVE_INFINITY, itr.next().getScore(), 0d); } + + @Test + public void bzpopmax() { + jedis.zadd("foo", 1d, "a", ZAddParams.zAddParams().nx()); + jedis.zadd("foo", 10d, "b", ZAddParams.zAddParams().nx()); + jedis.zadd("bar", 0.1d, "c", ZAddParams.zAddParams().nx()); + ScoreValueTuple actual = jedis.bzpopmax(0, "foo", "bar"); + assertEquals(new ScoreValueTuple("foo", "b", 10d), actual); + + jedis.del("foo"); + jedis.del("bar"); + + // Binary + jedis.zadd(bfoo, 1d, ba); + jedis.zadd(bfoo, 10d, bb); + jedis.zadd(bbar, 0.1d, bc); + actual = jedis.bzpopmax(0, bfoo, bbar); + assertEquals(new ScoreValueTuple(bfoo, bb, 10d), actual); + } + + @Test + public void bzpopmin() { + jedis.zadd("foo", 1d, "a", ZAddParams.zAddParams().nx()); + jedis.zadd("foo", 10d, "b", ZAddParams.zAddParams().nx()); + jedis.zadd("bar", 0.1d, "c", ZAddParams.zAddParams().nx()); + ScoreValueTuple actual = jedis.bzpopmin(0, "bar", "foo"); + assertEquals(new ScoreValueTuple("bar", "c", 0.1d), actual); + + jedis.del("foo"); + jedis.del("bar"); + + // Binary + jedis.zadd(bfoo, 1d, ba); + jedis.zadd(bfoo, 10d, bb); + jedis.zadd(bbar, 0.1d, bc); + actual = jedis.bzpopmin(0, bbar, bfoo); + assertEquals(new ScoreValueTuple(bbar, bc, 0.1d), actual); + } } From 99caad45ac3ff4798bd96af5facb6eab13badc9e Mon Sep 17 00:00:00 2001 From: dengliming Date: Mon, 15 Mar 2021 01:07:22 +0800 Subject: [PATCH 2/3] Fix review --- .../java/redis/clients/jedis/BinaryJedis.java | 4 ++-- .../clients/jedis/BinaryJedisCluster.java | 12 +++++------ .../redis/clients/jedis/BuilderFactory.java | 6 +++--- src/main/java/redis/clients/jedis/Jedis.java | 4 ++-- .../redis/clients/jedis/JedisCluster.java | 12 +++++------ .../{ScoreValueTuple.java => KeyedTuple.java} | 19 ++++++++---------- .../clients/jedis/MultiKeyPipelineBase.java | 8 ++++---- .../commands/MultiKeyBinaryCommands.java | 6 +++--- .../MultiKeyBinaryJedisClusterCommands.java | 6 +++--- .../commands/MultiKeyBinaryRedisPipeline.java | 6 +++--- .../jedis/commands/MultiKeyCommands.java | 6 +++--- .../commands/MultiKeyCommandsPipeline.java | 6 +++--- .../MultiKeyJedisClusterCommands.java | 6 +++--- .../tests/commands/SortedSetCommandsTest.java | 20 +++++++------------ 14 files changed, 56 insertions(+), 65 deletions(-) rename src/main/java/redis/clients/jedis/{ScoreValueTuple.java => KeyedTuple.java} (54%) diff --git a/src/main/java/redis/clients/jedis/BinaryJedis.java b/src/main/java/redis/clients/jedis/BinaryJedis.java index ff10f6eb72..bcff2a97f8 100644 --- a/src/main/java/redis/clients/jedis/BinaryJedis.java +++ b/src/main/java/redis/clients/jedis/BinaryJedis.java @@ -2364,14 +2364,14 @@ public List blpop(final int timeout, final byte[]... keys) { } @Override - public ScoreValueTuple bzpopmax(final int timeout, final byte[]... keys) { + public KeyedTuple bzpopmax(final int timeout, final byte[]... keys) { checkIsInMultiOrPipeline(); client.bzpopmax(timeout, keys); return BuilderFactory.SCORE_VALUE_TUPLE.build(client.getBinaryMultiBulkReply()); } @Override - public ScoreValueTuple bzpopmin(final int timeout, final byte[]... keys) { + public KeyedTuple bzpopmin(final int timeout, final byte[]... keys) { checkIsInMultiOrPipeline(); client.bzpopmin(timeout, keys); return BuilderFactory.SCORE_VALUE_TUPLE.build(client.getBinaryMultiBulkReply()); diff --git a/src/main/java/redis/clients/jedis/BinaryJedisCluster.java b/src/main/java/redis/clients/jedis/BinaryJedisCluster.java index 605a47dccb..d0b88cc2ab 100644 --- a/src/main/java/redis/clients/jedis/BinaryJedisCluster.java +++ b/src/main/java/redis/clients/jedis/BinaryJedisCluster.java @@ -1667,20 +1667,20 @@ public List execute(Jedis connection) { } @Override - public ScoreValueTuple bzpopmax(int timeout, byte[]... keys) { - return new JedisClusterCommand(connectionHandler, maxAttempts) { + public KeyedTuple bzpopmax(int timeout, byte[]... keys) { + return new JedisClusterCommand(connectionHandler, maxAttempts) { @Override - public ScoreValueTuple execute(Jedis connection) { + public KeyedTuple execute(Jedis connection) { return connection.bzpopmax(timeout, keys); } }.runBinary(keys.length, keys); } @Override - public ScoreValueTuple bzpopmin(int timeout, byte[]... keys) { - return new JedisClusterCommand(connectionHandler, maxAttempts) { + public KeyedTuple bzpopmin(int timeout, byte[]... keys) { + return new JedisClusterCommand(connectionHandler, maxAttempts) { @Override - public ScoreValueTuple execute(Jedis connection) { + public KeyedTuple execute(Jedis connection) { return connection.bzpopmin(timeout, keys); } }.runBinary(keys.length, keys); diff --git a/src/main/java/redis/clients/jedis/BuilderFactory.java b/src/main/java/redis/clients/jedis/BuilderFactory.java index e4867c00a8..0bb18cae93 100644 --- a/src/main/java/redis/clients/jedis/BuilderFactory.java +++ b/src/main/java/redis/clients/jedis/BuilderFactory.java @@ -326,15 +326,15 @@ public String toString() { }; - public static final Builder SCORE_VALUE_TUPLE = new Builder() { + public static final Builder SCORE_VALUE_TUPLE = new Builder() { @Override @SuppressWarnings("unchecked") - public ScoreValueTuple build(Object data) { + public KeyedTuple build(Object data) { List l = (List) data; // never null if (l.isEmpty()) { return null; } - return new ScoreValueTuple(l.get(0), l.get(1), DOUBLE.build(l.get(2))); + return new KeyedTuple(l.get(0), l.get(1), DOUBLE.build(l.get(2))); } @Override diff --git a/src/main/java/redis/clients/jedis/Jedis.java b/src/main/java/redis/clients/jedis/Jedis.java index e51bddb9db..8d8691f072 100644 --- a/src/main/java/redis/clients/jedis/Jedis.java +++ b/src/main/java/redis/clients/jedis/Jedis.java @@ -2025,14 +2025,14 @@ public List blpop(final int timeout, final String... keys) { } @Override - public ScoreValueTuple bzpopmax(int timeout, String... keys) { + public KeyedTuple bzpopmax(int timeout, String... keys) { checkIsInMultiOrPipeline(); client.bzpopmax(timeout, keys); return BuilderFactory.SCORE_VALUE_TUPLE.build(client.getObjectMultiBulkReply()); } @Override - public ScoreValueTuple bzpopmin(int timeout, String... keys) { + public KeyedTuple bzpopmin(int timeout, String... keys) { checkIsInMultiOrPipeline(); client.bzpopmin(timeout, keys); return BuilderFactory.SCORE_VALUE_TUPLE.build(client.getObjectMultiBulkReply()); diff --git a/src/main/java/redis/clients/jedis/JedisCluster.java b/src/main/java/redis/clients/jedis/JedisCluster.java index ad425117b5..6591706cd4 100644 --- a/src/main/java/redis/clients/jedis/JedisCluster.java +++ b/src/main/java/redis/clients/jedis/JedisCluster.java @@ -1757,20 +1757,20 @@ public List execute(Jedis connection) { } @Override - public ScoreValueTuple bzpopmax(int timeout, String... keys) { - return new JedisClusterCommand(connectionHandler, maxAttempts) { + public KeyedTuple bzpopmax(int timeout, String... keys) { + return new JedisClusterCommand(connectionHandler, maxAttempts) { @Override - public ScoreValueTuple execute(Jedis connection) { + public KeyedTuple execute(Jedis connection) { return connection.bzpopmax(timeout, keys); } }.run(keys.length, keys); } @Override - public ScoreValueTuple bzpopmin(int timeout, String... keys) { - return new JedisClusterCommand(connectionHandler, maxAttempts) { + public KeyedTuple bzpopmin(int timeout, String... keys) { + return new JedisClusterCommand(connectionHandler, maxAttempts) { @Override - public ScoreValueTuple execute(Jedis connection) { + public KeyedTuple execute(Jedis connection) { return connection.bzpopmin(timeout, keys); } }.run(keys.length, keys); diff --git a/src/main/java/redis/clients/jedis/ScoreValueTuple.java b/src/main/java/redis/clients/jedis/KeyedTuple.java similarity index 54% rename from src/main/java/redis/clients/jedis/ScoreValueTuple.java rename to src/main/java/redis/clients/jedis/KeyedTuple.java index a658ba6947..bf0bd39e98 100644 --- a/src/main/java/redis/clients/jedis/ScoreValueTuple.java +++ b/src/main/java/redis/clients/jedis/KeyedTuple.java @@ -4,15 +4,15 @@ import java.util.Arrays; -public class ScoreValueTuple extends Tuple { +public class KeyedTuple extends Tuple { private byte[] key; - public ScoreValueTuple(byte[] key, byte[] element, Double score) { + public KeyedTuple(byte[] key, byte[] element, Double score) { super(element, score); this.key = key; } - public ScoreValueTuple(String key, String element, Double score) { + public KeyedTuple(String key, String element, Double score) { super(element, score); this.key = SafeEncoder.encode(key); } @@ -27,24 +27,21 @@ public String getKey() { @Override public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof ScoreValueTuple)) return false; + if (!(o instanceof KeyedTuple)) return false; if (!super.equals(o)) return false; - ScoreValueTuple that = (ScoreValueTuple) o; + KeyedTuple that = (KeyedTuple) o; return Arrays.equals(key, that.key); } @Override public int hashCode() { - int result = super.hashCode(); - result = 31 * result + (key != null ? Arrays.hashCode(key) : 0); - return result; + return 31 * (key != null ? Arrays.hashCode(key) : 0) + super.hashCode(); } @Override public String toString() { - return "ScoreValueTuple{" + - "key=" + SafeEncoder.encode(key) + - "} " + super.toString(); + return "KeyedTuple{" + "key=" + SafeEncoder.encode(key) + ", element='" + getElement() + "'" + + ", score=" + getScore() + "} "; } } diff --git a/src/main/java/redis/clients/jedis/MultiKeyPipelineBase.java b/src/main/java/redis/clients/jedis/MultiKeyPipelineBase.java index 9b134bcbc6..21ff855766 100644 --- a/src/main/java/redis/clients/jedis/MultiKeyPipelineBase.java +++ b/src/main/java/redis/clients/jedis/MultiKeyPipelineBase.java @@ -70,25 +70,25 @@ public Response> blpop(int timeout, byte[]... keys) { } @Override - public Response bzpopmax(int timeout, String... keys) { + public Response bzpopmax(int timeout, String... keys) { client.bzpopmax(timeout, keys); return getResponse(BuilderFactory.SCORE_VALUE_TUPLE); } @Override - public Response bzpopmin(int timeout, String... keys) { + public Response bzpopmin(int timeout, String... keys) { client.bzpopmin(timeout, keys); return getResponse(BuilderFactory.SCORE_VALUE_TUPLE); } @Override - public Response bzpopmax(int timeout, byte[]... keys) { + public Response bzpopmax(int timeout, byte[]... keys) { client.bzpopmax(timeout, keys); return getResponse(BuilderFactory.SCORE_VALUE_TUPLE); } @Override - public Response bzpopmin(int timeout, byte[]... keys) { + public Response bzpopmin(int timeout, byte[]... keys) { client.bzpopmin(timeout, keys); return getResponse(BuilderFactory.SCORE_VALUE_TUPLE); } diff --git a/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryCommands.java b/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryCommands.java index 1b04eca9d8..a041fe8116 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryCommands.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryCommands.java @@ -3,7 +3,7 @@ import redis.clients.jedis.BinaryJedisPubSub; import redis.clients.jedis.BitOP; import redis.clients.jedis.GeoUnit; -import redis.clients.jedis.ScoreValueTuple; +import redis.clients.jedis.KeyedTuple; import redis.clients.jedis.SortingParams; import redis.clients.jedis.ZParams; import redis.clients.jedis.params.GeoRadiusParam; @@ -28,9 +28,9 @@ public interface MultiKeyBinaryCommands { List brpop(byte[]... args); - ScoreValueTuple bzpopmax(int timeout, byte[]... keys); + KeyedTuple bzpopmax(int timeout, byte[]... keys); - ScoreValueTuple bzpopmin(int timeout, byte[]... keys); + KeyedTuple bzpopmin(int timeout, byte[]... keys); Set keys(byte[] pattern); diff --git a/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryJedisClusterCommands.java b/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryJedisClusterCommands.java index 0229181cd5..6b8adf8b3b 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryJedisClusterCommands.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryJedisClusterCommands.java @@ -5,7 +5,7 @@ import redis.clients.jedis.GeoUnit; import redis.clients.jedis.ScanParams; import redis.clients.jedis.ScanResult; -import redis.clients.jedis.ScoreValueTuple; +import redis.clients.jedis.KeyedTuple; import redis.clients.jedis.SortingParams; import redis.clients.jedis.ZParams; import redis.clients.jedis.params.GeoRadiusParam; @@ -26,9 +26,9 @@ public interface MultiKeyBinaryJedisClusterCommands { List brpop(int timeout, byte[]... keys); - ScoreValueTuple bzpopmax(int timeout, byte[]... keys); + KeyedTuple bzpopmax(int timeout, byte[]... keys); - ScoreValueTuple bzpopmin(int timeout, byte[]... keys); + KeyedTuple bzpopmin(int timeout, byte[]... keys); List mget(byte[]... keys); diff --git a/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryRedisPipeline.java b/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryRedisPipeline.java index caea5a6078..e04e394b62 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryRedisPipeline.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryRedisPipeline.java @@ -3,7 +3,7 @@ import redis.clients.jedis.BitOP; import redis.clients.jedis.GeoUnit; import redis.clients.jedis.Response; -import redis.clients.jedis.ScoreValueTuple; +import redis.clients.jedis.KeyedTuple; import redis.clients.jedis.SortingParams; import redis.clients.jedis.ZParams; import redis.clients.jedis.params.GeoRadiusParam; @@ -28,9 +28,9 @@ public interface MultiKeyBinaryRedisPipeline { Response> brpop(byte[]... args); - Response bzpopmax(int timeout, byte[]... keys); + Response bzpopmax(int timeout, byte[]... keys); - Response bzpopmin(int timeout, byte[]... keys); + Response bzpopmin(int timeout, byte[]... keys); Response> keys(byte[] pattern); diff --git a/src/main/java/redis/clients/jedis/commands/MultiKeyCommands.java b/src/main/java/redis/clients/jedis/commands/MultiKeyCommands.java index fb0679ece0..1dc7a09c68 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyCommands.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyCommands.java @@ -2,7 +2,7 @@ import redis.clients.jedis.BitOP; import redis.clients.jedis.GeoUnit; -import redis.clients.jedis.ScoreValueTuple; +import redis.clients.jedis.KeyedTuple; import redis.clients.jedis.StreamEntryID; import redis.clients.jedis.JedisPubSub; import redis.clients.jedis.ScanParams; @@ -32,9 +32,9 @@ public interface MultiKeyCommands { List brpop(String... args); - ScoreValueTuple bzpopmax(int timeout, String... keys); + KeyedTuple bzpopmax(int timeout, String... keys); - ScoreValueTuple bzpopmin(int timeout, String... keys); + KeyedTuple bzpopmin(int timeout, String... keys); /** * Returns all the keys matching the glob-style pattern. For example if you have in the database diff --git a/src/main/java/redis/clients/jedis/commands/MultiKeyCommandsPipeline.java b/src/main/java/redis/clients/jedis/commands/MultiKeyCommandsPipeline.java index 44fa2d527c..c1c4eed67a 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyCommandsPipeline.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyCommandsPipeline.java @@ -3,7 +3,7 @@ import redis.clients.jedis.BitOP; import redis.clients.jedis.GeoUnit; import redis.clients.jedis.Response; -import redis.clients.jedis.ScoreValueTuple; +import redis.clients.jedis.KeyedTuple; import redis.clients.jedis.SortingParams; import redis.clients.jedis.ZParams; import redis.clients.jedis.params.GeoRadiusParam; @@ -27,9 +27,9 @@ public interface MultiKeyCommandsPipeline { Response> brpop(String... args); - Response bzpopmax(int timeout, String... keys); + Response bzpopmax(int timeout, String... keys); - Response bzpopmin(int timeout, String... keys); + Response bzpopmin(int timeout, String... keys); Response> keys(String pattern); diff --git a/src/main/java/redis/clients/jedis/commands/MultiKeyJedisClusterCommands.java b/src/main/java/redis/clients/jedis/commands/MultiKeyJedisClusterCommands.java index 655acbe6b3..0454ce26fa 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyJedisClusterCommands.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyJedisClusterCommands.java @@ -5,7 +5,7 @@ import redis.clients.jedis.JedisPubSub; import redis.clients.jedis.ScanParams; import redis.clients.jedis.ScanResult; -import redis.clients.jedis.ScoreValueTuple; +import redis.clients.jedis.KeyedTuple; import redis.clients.jedis.SortingParams; import redis.clients.jedis.StreamEntry; import redis.clients.jedis.StreamEntryID; @@ -29,9 +29,9 @@ public interface MultiKeyJedisClusterCommands { List brpop(int timeout, String... keys); - ScoreValueTuple bzpopmax(int timeout, String... keys); + KeyedTuple bzpopmax(int timeout, String... keys); - ScoreValueTuple bzpopmin(int timeout, String... keys); + KeyedTuple bzpopmin(int timeout, String... keys); List mget(String... keys); 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 1f5340f99a..4c4864704e 100644 --- a/src/test/java/redis/clients/jedis/tests/commands/SortedSetCommandsTest.java +++ b/src/test/java/redis/clients/jedis/tests/commands/SortedSetCommandsTest.java @@ -19,7 +19,7 @@ import redis.clients.jedis.ScanParams; import redis.clients.jedis.ScanResult; -import redis.clients.jedis.ScoreValueTuple; +import redis.clients.jedis.KeyedTuple; import redis.clients.jedis.Tuple; import redis.clients.jedis.ZParams; import redis.clients.jedis.params.ZAddParams; @@ -1419,18 +1419,15 @@ public void bzpopmax() { jedis.zadd("foo", 1d, "a", ZAddParams.zAddParams().nx()); jedis.zadd("foo", 10d, "b", ZAddParams.zAddParams().nx()); jedis.zadd("bar", 0.1d, "c", ZAddParams.zAddParams().nx()); - ScoreValueTuple actual = jedis.bzpopmax(0, "foo", "bar"); - assertEquals(new ScoreValueTuple("foo", "b", 10d), actual); - - jedis.del("foo"); - jedis.del("bar"); + KeyedTuple actual = jedis.bzpopmax(0, "foo", "bar"); + assertEquals(new KeyedTuple("foo", "b", 10d), actual); // Binary jedis.zadd(bfoo, 1d, ba); jedis.zadd(bfoo, 10d, bb); jedis.zadd(bbar, 0.1d, bc); actual = jedis.bzpopmax(0, bfoo, bbar); - assertEquals(new ScoreValueTuple(bfoo, bb, 10d), actual); + assertEquals(new KeyedTuple(bfoo, bb, 10d), actual); } @Test @@ -1438,17 +1435,14 @@ public void bzpopmin() { jedis.zadd("foo", 1d, "a", ZAddParams.zAddParams().nx()); jedis.zadd("foo", 10d, "b", ZAddParams.zAddParams().nx()); jedis.zadd("bar", 0.1d, "c", ZAddParams.zAddParams().nx()); - ScoreValueTuple actual = jedis.bzpopmin(0, "bar", "foo"); - assertEquals(new ScoreValueTuple("bar", "c", 0.1d), actual); - - jedis.del("foo"); - jedis.del("bar"); + KeyedTuple actual = jedis.bzpopmin(0, "bar", "foo"); + assertEquals(new KeyedTuple("bar", "c", 0.1d), actual); // Binary jedis.zadd(bfoo, 1d, ba); jedis.zadd(bfoo, 10d, bb); jedis.zadd(bbar, 0.1d, bc); actual = jedis.bzpopmin(0, bbar, bfoo); - assertEquals(new ScoreValueTuple(bbar, bc, 0.1d), actual); + assertEquals(new KeyedTuple(bbar, bc, 0.1d), actual); } } From c00b1b6cf2e3f070950c23946baaae7d361c2b63 Mon Sep 17 00:00:00 2001 From: dengliming Date: Mon, 15 Mar 2021 08:01:45 +0800 Subject: [PATCH 3/3] review --- src/main/java/redis/clients/jedis/BinaryJedis.java | 4 ++-- src/main/java/redis/clients/jedis/BuilderFactory.java | 4 ++-- src/main/java/redis/clients/jedis/Jedis.java | 4 ++-- .../java/redis/clients/jedis/MultiKeyPipelineBase.java | 8 ++++---- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/redis/clients/jedis/BinaryJedis.java b/src/main/java/redis/clients/jedis/BinaryJedis.java index bcff2a97f8..22d1a41b98 100644 --- a/src/main/java/redis/clients/jedis/BinaryJedis.java +++ b/src/main/java/redis/clients/jedis/BinaryJedis.java @@ -2367,14 +2367,14 @@ public List blpop(final int timeout, final byte[]... keys) { public KeyedTuple bzpopmax(final int timeout, final byte[]... keys) { checkIsInMultiOrPipeline(); client.bzpopmax(timeout, keys); - return BuilderFactory.SCORE_VALUE_TUPLE.build(client.getBinaryMultiBulkReply()); + return BuilderFactory.KEYED_TUPLE.build(client.getBinaryMultiBulkReply()); } @Override public KeyedTuple bzpopmin(final int timeout, final byte[]... keys) { checkIsInMultiOrPipeline(); client.bzpopmin(timeout, keys); - return BuilderFactory.SCORE_VALUE_TUPLE.build(client.getBinaryMultiBulkReply()); + return BuilderFactory.KEYED_TUPLE.build(client.getBinaryMultiBulkReply()); } private byte[][] getArgsAddTimeout(int timeout, byte[][] keys) { diff --git a/src/main/java/redis/clients/jedis/BuilderFactory.java b/src/main/java/redis/clients/jedis/BuilderFactory.java index 0bb18cae93..2a8645de47 100644 --- a/src/main/java/redis/clients/jedis/BuilderFactory.java +++ b/src/main/java/redis/clients/jedis/BuilderFactory.java @@ -326,7 +326,7 @@ public String toString() { }; - public static final Builder SCORE_VALUE_TUPLE = new Builder() { + public static final Builder KEYED_TUPLE = new Builder() { @Override @SuppressWarnings("unchecked") public KeyedTuple build(Object data) { @@ -339,7 +339,7 @@ public KeyedTuple build(Object data) { @Override public String toString() { - return "ScoreValueTuple"; + return "KeyedTuple"; } }; diff --git a/src/main/java/redis/clients/jedis/Jedis.java b/src/main/java/redis/clients/jedis/Jedis.java index 8d8691f072..8ada9c34a6 100644 --- a/src/main/java/redis/clients/jedis/Jedis.java +++ b/src/main/java/redis/clients/jedis/Jedis.java @@ -2028,14 +2028,14 @@ public List blpop(final int timeout, final String... keys) { public KeyedTuple bzpopmax(int timeout, String... keys) { checkIsInMultiOrPipeline(); client.bzpopmax(timeout, keys); - return BuilderFactory.SCORE_VALUE_TUPLE.build(client.getObjectMultiBulkReply()); + return BuilderFactory.KEYED_TUPLE.build(client.getObjectMultiBulkReply()); } @Override public KeyedTuple bzpopmin(int timeout, String... keys) { checkIsInMultiOrPipeline(); client.bzpopmin(timeout, keys); - return BuilderFactory.SCORE_VALUE_TUPLE.build(client.getObjectMultiBulkReply()); + return BuilderFactory.KEYED_TUPLE.build(client.getObjectMultiBulkReply()); } private String[] getArgsAddTimeout(int timeout, String[] keys) { diff --git a/src/main/java/redis/clients/jedis/MultiKeyPipelineBase.java b/src/main/java/redis/clients/jedis/MultiKeyPipelineBase.java index 21ff855766..2ee271192e 100644 --- a/src/main/java/redis/clients/jedis/MultiKeyPipelineBase.java +++ b/src/main/java/redis/clients/jedis/MultiKeyPipelineBase.java @@ -72,25 +72,25 @@ public Response> blpop(int timeout, byte[]... keys) { @Override public Response bzpopmax(int timeout, String... keys) { client.bzpopmax(timeout, keys); - return getResponse(BuilderFactory.SCORE_VALUE_TUPLE); + return getResponse(BuilderFactory.KEYED_TUPLE); } @Override public Response bzpopmin(int timeout, String... keys) { client.bzpopmin(timeout, keys); - return getResponse(BuilderFactory.SCORE_VALUE_TUPLE); + return getResponse(BuilderFactory.KEYED_TUPLE); } @Override public Response bzpopmax(int timeout, byte[]... keys) { client.bzpopmax(timeout, keys); - return getResponse(BuilderFactory.SCORE_VALUE_TUPLE); + return getResponse(BuilderFactory.KEYED_TUPLE); } @Override public Response bzpopmin(int timeout, byte[]... keys) { client.bzpopmin(timeout, keys); - return getResponse(BuilderFactory.SCORE_VALUE_TUPLE); + return getResponse(BuilderFactory.KEYED_TUPLE); } @Override