From 0974b7fe41b6ec42f78db07441476b5952db50b6 Mon Sep 17 00:00:00 2001 From: dengliming Date: Sun, 21 Mar 2021 23:48:50 +0800 Subject: [PATCH 1/3] Add support for COPY command --- .../redis/clients/jedis/BinaryClient.java | 8 ++++ .../java/redis/clients/jedis/BinaryJedis.java | 15 ++++++ .../clients/jedis/BinaryJedisCluster.java | 10 ++++ src/main/java/redis/clients/jedis/Client.java | 5 ++ src/main/java/redis/clients/jedis/Jedis.java | 15 ++++++ .../redis/clients/jedis/JedisCluster.java | 10 ++++ .../clients/jedis/MultiKeyPipelineBase.java | 12 +++++ .../java/redis/clients/jedis/Protocol.java | 4 +- .../clients/jedis/commands/Commands.java | 3 ++ .../commands/MultiKeyBinaryCommands.java | 3 ++ .../MultiKeyBinaryJedisClusterCommands.java | 4 ++ .../commands/MultiKeyBinaryRedisPipeline.java | 1 + .../jedis/commands/MultiKeyCommands.java | 4 ++ .../commands/MultiKeyCommandsPipeline.java | 2 + .../MultiKeyJedisClusterCommands.java | 2 + .../clients/jedis/params/CopyParams.java | 47 +++++++++++++++++++ .../commands/AllKindOfValuesCommandsTest.java | 19 ++++++++ 17 files changed, 162 insertions(+), 2 deletions(-) create mode 100644 src/main/java/redis/clients/jedis/params/CopyParams.java diff --git a/src/main/java/redis/clients/jedis/BinaryClient.java b/src/main/java/redis/clients/jedis/BinaryClient.java index d50df660e7..0659e9984b 100644 --- a/src/main/java/redis/clients/jedis/BinaryClient.java +++ b/src/main/java/redis/clients/jedis/BinaryClient.java @@ -165,6 +165,14 @@ public void resetState() { } } + public void copy(byte[] srcKey, byte[] dstKey, CopyParams params) { + if (params == null) { + sendCommand(COPY, srcKey, dstKey); + } else { + sendCommand(COPY, params.getByteParams(srcKey, dstKey)); + } + } + public void ping() { sendCommand(PING); } diff --git a/src/main/java/redis/clients/jedis/BinaryJedis.java b/src/main/java/redis/clients/jedis/BinaryJedis.java index eb65b928e1..9421a002e6 100644 --- a/src/main/java/redis/clients/jedis/BinaryJedis.java +++ b/src/main/java/redis/clients/jedis/BinaryJedis.java @@ -324,6 +324,21 @@ public int getDB() { return client.getDB(); } + /** + * COPY source destination [DB destination-db] [REPLACE] + * + * @param srcKey the source key. + * @param dstKey the destination key. + * @param params + * @return + */ + @Override + public Long copy(byte[] srcKey, byte[] dstKey, CopyParams params) { + checkIsInMultiOrPipeline(); + client.copy(srcKey, dstKey, params); + return client.getIntegerReply(); + } + /** * @return PONG */ diff --git a/src/main/java/redis/clients/jedis/BinaryJedisCluster.java b/src/main/java/redis/clients/jedis/BinaryJedisCluster.java index af98458741..5b0e63354a 100644 --- a/src/main/java/redis/clients/jedis/BinaryJedisCluster.java +++ b/src/main/java/redis/clients/jedis/BinaryJedisCluster.java @@ -156,6 +156,16 @@ public Jedis getConnectionFromSlot(int slot) { return this.connectionHandler.getConnectionFromSlot(slot); } + @Override + public Long copy(byte[] srcKey, byte[] dstKey, CopyParams params) { + return new JedisClusterCommand(connectionHandler, maxAttempts) { + @Override + public Long execute(Jedis connection) { + return connection.copy(srcKey, dstKey, params); + } + }.runBinary(2, srcKey, dstKey); + } + @Override public String set(final byte[] key, final byte[] value) { 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 0ad1e4265f..17a5f68ac2 100644 --- a/src/main/java/redis/clients/jedis/Client.java +++ b/src/main/java/redis/clients/jedis/Client.java @@ -63,6 +63,11 @@ public Client(final JedisSocketFactory jedisSocketFactory) { super(jedisSocketFactory); } + @Override + public void copy(String srcKey, String dstKey, CopyParams params) { + copy(SafeEncoder.encode(srcKey), SafeEncoder.encode(dstKey), params); + } + @Override public void ping(final String message) { ping(SafeEncoder.encode(message)); diff --git a/src/main/java/redis/clients/jedis/Jedis.java b/src/main/java/redis/clients/jedis/Jedis.java index eb411ee49b..79032209eb 100644 --- a/src/main/java/redis/clients/jedis/Jedis.java +++ b/src/main/java/redis/clients/jedis/Jedis.java @@ -156,6 +156,21 @@ public Jedis(final JedisSocketFactory jedisSocketFactory) { super(jedisSocketFactory); } + /** + * COPY source destination [DB destination-db] [REPLACE] + * + * @param srcKey the source key. + * @param dstKey the destination key. + * @param params + * @return + */ + @Override + public Long copy(String srcKey, String dstKey, CopyParams params) { + checkIsInMultiOrPipeline(); + client.copy(srcKey, dstKey, params); + return client.getIntegerReply(); + } + /** * Works same as ping() but returns argument message instead of PONG. * @param message diff --git a/src/main/java/redis/clients/jedis/JedisCluster.java b/src/main/java/redis/clients/jedis/JedisCluster.java index 658dd87bdf..9d31ce6ea4 100644 --- a/src/main/java/redis/clients/jedis/JedisCluster.java +++ b/src/main/java/redis/clients/jedis/JedisCluster.java @@ -247,6 +247,16 @@ public JedisCluster(Set nodes, final JedisClientConfig clientConfig super(nodes, clientConfig, maxAttempts, poolConfig); } + @Override + public Long copy(String srcKey, String dstKey, CopyParams params) { + return new JedisClusterCommand(connectionHandler, maxAttempts) { + @Override + public Long execute(Jedis connection) { + return connection.copy(srcKey, dstKey, params); + } + }.run(2, srcKey, dstKey); + } + @Override public String set(final String key, final String value) { 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 09f1e49e96..63410b9891 100644 --- a/src/main/java/redis/clients/jedis/MultiKeyPipelineBase.java +++ b/src/main/java/redis/clients/jedis/MultiKeyPipelineBase.java @@ -14,6 +14,18 @@ public abstract class MultiKeyPipelineBase extends PipelineBase implements protected Client client = null; + @Override + public Response copy(byte[] srcKey, byte[] dstKey, CopyParams params) { + client.copy(srcKey, dstKey, params); + return getResponse(BuilderFactory.LONG); + } + + @Override + public Response copy(String srcKey, String dstKey, CopyParams params) { + client.copy(srcKey, dstKey, params); + return getResponse(BuilderFactory.LONG); + } + @Override public Response> brpop(String... args) { client.brpop(args); diff --git a/src/main/java/redis/clients/jedis/Protocol.java b/src/main/java/redis/clients/jedis/Protocol.java index f0c3311ec5..9106dd0fe7 100644 --- a/src/main/java/redis/clients/jedis/Protocol.java +++ b/src/main/java/redis/clients/jedis/Protocol.java @@ -264,7 +264,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, BZPOPMIN, BZPOPMAX; + BITFIELD_RO, LPOS, SMISMEMBER, ZMSCORE, BZPOPMIN, BZPOPMAX, COPY; private final byte[] raw; @@ -286,7 +286,7 @@ public static enum Keyword implements Rawable { NOACK, STREAMS, KEY, CREATE, MKSTREAM, SETID, DESTROY, DELCONSUMER, MAXLEN, GROUP, ID, IDLE, TIME, RETRYCOUNT, FORCE, USAGE, SAMPLES, STREAM, GROUPS, CONSUMERS, HELP, FREQ, SETUSER, GETUSER, DELUSER, WHOAMI, CAT, GENPASS, USERS, LOG, INCR, SAVE, JUSTID, WITHVALUES, UNBLOCK, - NOMKSTREAM, MINID; + NOMKSTREAM, MINID, DB; /** * @deprecated This will be private in future. Use {@link #getRaw()}. diff --git a/src/main/java/redis/clients/jedis/commands/Commands.java b/src/main/java/redis/clients/jedis/commands/Commands.java index 2572fdef32..4e02c764d3 100644 --- a/src/main/java/redis/clients/jedis/commands/Commands.java +++ b/src/main/java/redis/clients/jedis/commands/Commands.java @@ -10,6 +10,7 @@ import redis.clients.jedis.SortingParams; import redis.clients.jedis.args.UnblockType; import redis.clients.jedis.ZParams; +import redis.clients.jedis.params.CopyParams; import redis.clients.jedis.params.GetExParams; import redis.clients.jedis.params.MigrateParams; import redis.clients.jedis.params.ClientKillParams; @@ -25,6 +26,8 @@ public interface Commands { + void copy(String srcKey, String dstKey, CopyParams params); + void ping(String message); void set(String key, String value); diff --git a/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryCommands.java b/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryCommands.java index fa6ec4a23c..8dd57f14b1 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryCommands.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryCommands.java @@ -7,6 +7,7 @@ import redis.clients.jedis.SortingParams; import redis.clients.jedis.Tuple; import redis.clients.jedis.ZParams; +import redis.clients.jedis.params.CopyParams; import redis.clients.jedis.params.GeoRadiusParam; import redis.clients.jedis.params.GeoRadiusStoreParam; import redis.clients.jedis.params.XReadGroupParams; @@ -18,6 +19,8 @@ import java.util.Set; public interface MultiKeyBinaryCommands { + Long copy(byte[] srcKey, byte[] dstKey, CopyParams params); + Long del(byte[]... keys); Long unlink(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 72df34cc28..062736ddd1 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryJedisClusterCommands.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryJedisClusterCommands.java @@ -3,12 +3,14 @@ import redis.clients.jedis.BinaryJedisPubSub; import redis.clients.jedis.BitOP; import redis.clients.jedis.GeoUnit; +import redis.clients.jedis.Response; import redis.clients.jedis.ScanParams; 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.CopyParams; import redis.clients.jedis.params.GeoRadiusParam; import redis.clients.jedis.params.GeoRadiusStoreParam; import redis.clients.jedis.params.XReadGroupParams; @@ -20,6 +22,8 @@ import java.util.Set; public interface MultiKeyBinaryJedisClusterCommands { + Long copy(byte[] srcKey, byte[] dstKey, CopyParams params); + Long del(byte[]... keys); Long unlink(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 b8b65d9687..99ae9d13f3 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryRedisPipeline.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryRedisPipeline.java @@ -17,6 +17,7 @@ * Multikey related commands (these are split out because they are non-shardable) */ public interface MultiKeyBinaryRedisPipeline { + Response copy(byte[] srcKey, byte[] dstKey, CopyParams params); Response del(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 4121ce92b2..521cb5f6df 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyCommands.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyCommands.java @@ -11,6 +11,7 @@ import redis.clients.jedis.StreamEntry; import redis.clients.jedis.Tuple; import redis.clients.jedis.ZParams; +import redis.clients.jedis.params.CopyParams; import redis.clients.jedis.params.GeoRadiusParam; import redis.clients.jedis.params.GeoRadiusStoreParam; import redis.clients.jedis.params.XReadGroupParams; @@ -21,6 +22,9 @@ import java.util.Set; public interface MultiKeyCommands { + + Long copy(String srcKey, String dstKey, CopyParams params); + Long del(String... keys); Long unlink(String... keys); diff --git a/src/main/java/redis/clients/jedis/commands/MultiKeyCommandsPipeline.java b/src/main/java/redis/clients/jedis/commands/MultiKeyCommandsPipeline.java index e906a253fe..ae70bbf8d6 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyCommandsPipeline.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyCommandsPipeline.java @@ -19,6 +19,8 @@ * Multikey related commands (these are split out because they are non-shardable) */ public interface MultiKeyCommandsPipeline { + Response copy(String srcKey, String dstKey, CopyParams params); + Response del(String... keys); Response unlink(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 5e39ba6735..5d6ccd3d0b 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyJedisClusterCommands.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyJedisClusterCommands.java @@ -11,6 +11,7 @@ import redis.clients.jedis.StreamEntryID; import redis.clients.jedis.Tuple; import redis.clients.jedis.ZParams; +import redis.clients.jedis.params.CopyParams; import redis.clients.jedis.params.GeoRadiusParam; import redis.clients.jedis.params.GeoRadiusStoreParam; import redis.clients.jedis.params.XReadGroupParams; @@ -21,6 +22,7 @@ import java.util.Set; public interface MultiKeyJedisClusterCommands { + Long copy(String srcKey, String dstKey, CopyParams params); Long del(String... keys); diff --git a/src/main/java/redis/clients/jedis/params/CopyParams.java b/src/main/java/redis/clients/jedis/params/CopyParams.java new file mode 100644 index 0000000000..b0fdcd0818 --- /dev/null +++ b/src/main/java/redis/clients/jedis/params/CopyParams.java @@ -0,0 +1,47 @@ +package redis.clients.jedis.params; + +import static redis.clients.jedis.Protocol.Keyword.DB; +import static redis.clients.jedis.Protocol.Keyword.REPLACE; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import redis.clients.jedis.Protocol; + +public class CopyParams extends Params { + + private Long destinationDb; + + private boolean replace; + + public static CopyParams copyParams() { + return new CopyParams(); + } + + public CopyParams destinationDb(long destinationDb) { + this.destinationDb = destinationDb; + return this; + } + + public CopyParams replace() { + this.replace = true; + return this; + } + + public byte[][] getByteParams(byte[] key, byte[]... args) { + List byteParams = new ArrayList<>(); + byteParams.add(key); + Collections.addAll(byteParams, args); + + if (destinationDb != null) { + byteParams.add(DB.getRaw()); + byteParams.add(Protocol.toByteArray(destinationDb)); + } + + if (replace) { + byteParams.add(REPLACE.getRaw()); + } + return byteParams.toArray(new byte[byteParams.size()][]); + } +} diff --git a/src/test/java/redis/clients/jedis/tests/commands/AllKindOfValuesCommandsTest.java b/src/test/java/redis/clients/jedis/tests/commands/AllKindOfValuesCommandsTest.java index f082d4cb70..b63d1f862d 100644 --- a/src/test/java/redis/clients/jedis/tests/commands/AllKindOfValuesCommandsTest.java +++ b/src/test/java/redis/clients/jedis/tests/commands/AllKindOfValuesCommandsTest.java @@ -36,6 +36,7 @@ import redis.clients.jedis.ScanResult; import redis.clients.jedis.StreamEntryID; import redis.clients.jedis.args.FlushMode; +import redis.clients.jedis.params.CopyParams; import redis.clients.jedis.util.SafeEncoder; import redis.clients.jedis.exceptions.JedisDataException; @@ -940,4 +941,22 @@ public void encodeCompleteResponse() { } + @Test + public void copy() { + jedis.set("foo", "bar"); + assertEquals(1, jedis.copy("foo", "bar", null).longValue()); + assertEquals(0, jedis.copy("unknown", "bar1", null).longValue()); + assertEquals("bar", jedis.get("bar")); + + // with destinationDb + assertEquals(1, jedis.copy("foo", "bar1", new CopyParams().destinationDb(2)).longValue()); + jedis.select(2); + assertEquals("bar", jedis.get("bar1")); + + // replace + jedis.set("foo", "bar"); + jedis.set("bar2", "b"); + assertEquals(1, jedis.copy("foo", "bar2", new CopyParams().replace()).longValue()); + assertEquals("bar", jedis.get("bar2")); + } } From 5a77c9c77ae8b5602387542e5e34a6a3cd13ec73 Mon Sep 17 00:00:00 2001 From: dengliming Date: Mon, 22 Mar 2021 09:18:56 +0800 Subject: [PATCH 2/3] review --- src/main/java/redis/clients/jedis/BinaryClient.java | 8 ++++++++ src/main/java/redis/clients/jedis/BinaryJedis.java | 7 +++++++ src/main/java/redis/clients/jedis/BinaryJedisCluster.java | 4 ++-- src/main/java/redis/clients/jedis/Client.java | 5 +++++ src/main/java/redis/clients/jedis/Jedis.java | 7 +++++++ src/main/java/redis/clients/jedis/JedisCluster.java | 4 ++-- src/main/java/redis/clients/jedis/commands/Commands.java | 2 ++ .../clients/jedis/commands/MultiKeyBinaryCommands.java | 2 ++ .../commands/MultiKeyBinaryJedisClusterCommands.java | 2 +- .../redis/clients/jedis/commands/MultiKeyCommands.java | 2 ++ .../jedis/commands/MultiKeyJedisClusterCommands.java | 2 +- 11 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/main/java/redis/clients/jedis/BinaryClient.java b/src/main/java/redis/clients/jedis/BinaryClient.java index 0659e9984b..a382a718c8 100644 --- a/src/main/java/redis/clients/jedis/BinaryClient.java +++ b/src/main/java/redis/clients/jedis/BinaryClient.java @@ -165,6 +165,14 @@ public void resetState() { } } + public void copy(byte[] srcKey, byte[] dstKey, boolean replace) { + if (replace) { + sendCommand(COPY, srcKey, dstKey, REPLACE.getRaw()); + } else { + sendCommand(COPY, srcKey, dstKey); + } + } + public void copy(byte[] srcKey, byte[] dstKey, CopyParams params) { if (params == null) { sendCommand(COPY, srcKey, dstKey); diff --git a/src/main/java/redis/clients/jedis/BinaryJedis.java b/src/main/java/redis/clients/jedis/BinaryJedis.java index 9421a002e6..cf4d37d16e 100644 --- a/src/main/java/redis/clients/jedis/BinaryJedis.java +++ b/src/main/java/redis/clients/jedis/BinaryJedis.java @@ -339,6 +339,13 @@ public Long copy(byte[] srcKey, byte[] dstKey, CopyParams params) { return client.getIntegerReply(); } + @Override + public Long copy(byte[] srcKey, byte[] dstKey, boolean replace) { + checkIsInMultiOrPipeline(); + client.copy(srcKey, dstKey, replace); + return client.getIntegerReply(); + } + /** * @return PONG */ diff --git a/src/main/java/redis/clients/jedis/BinaryJedisCluster.java b/src/main/java/redis/clients/jedis/BinaryJedisCluster.java index 5b0e63354a..af13302f1d 100644 --- a/src/main/java/redis/clients/jedis/BinaryJedisCluster.java +++ b/src/main/java/redis/clients/jedis/BinaryJedisCluster.java @@ -157,11 +157,11 @@ public Jedis getConnectionFromSlot(int slot) { } @Override - public Long copy(byte[] srcKey, byte[] dstKey, CopyParams params) { + public Long copy(byte[] srcKey, byte[] dstKey, boolean replace) { return new JedisClusterCommand(connectionHandler, maxAttempts) { @Override public Long execute(Jedis connection) { - return connection.copy(srcKey, dstKey, params); + return connection.copy(srcKey, dstKey, replace); } }.runBinary(2, srcKey, dstKey); } diff --git a/src/main/java/redis/clients/jedis/Client.java b/src/main/java/redis/clients/jedis/Client.java index 17a5f68ac2..8ae55ab6bc 100644 --- a/src/main/java/redis/clients/jedis/Client.java +++ b/src/main/java/redis/clients/jedis/Client.java @@ -68,6 +68,11 @@ public void copy(String srcKey, String dstKey, CopyParams params) { copy(SafeEncoder.encode(srcKey), SafeEncoder.encode(dstKey), params); } + @Override + public void copy(String srcKey, String dstKey, boolean replace) { + copy(SafeEncoder.encode(srcKey), SafeEncoder.encode(dstKey), replace); + } + @Override public void ping(final String message) { ping(SafeEncoder.encode(message)); diff --git a/src/main/java/redis/clients/jedis/Jedis.java b/src/main/java/redis/clients/jedis/Jedis.java index 79032209eb..25f296b794 100644 --- a/src/main/java/redis/clients/jedis/Jedis.java +++ b/src/main/java/redis/clients/jedis/Jedis.java @@ -171,6 +171,13 @@ public Long copy(String srcKey, String dstKey, CopyParams params) { return client.getIntegerReply(); } + @Override + public Long copy(String srcKey, String dstKey, boolean replace) { + checkIsInMultiOrPipeline(); + client.copy(srcKey, dstKey, replace); + return client.getIntegerReply(); + } + /** * Works same as ping() but returns argument message instead of PONG. * @param message diff --git a/src/main/java/redis/clients/jedis/JedisCluster.java b/src/main/java/redis/clients/jedis/JedisCluster.java index 9d31ce6ea4..9fa12976b2 100644 --- a/src/main/java/redis/clients/jedis/JedisCluster.java +++ b/src/main/java/redis/clients/jedis/JedisCluster.java @@ -248,11 +248,11 @@ public JedisCluster(Set nodes, final JedisClientConfig clientConfig } @Override - public Long copy(String srcKey, String dstKey, CopyParams params) { + public Long copy(String srcKey, String dstKey, boolean replace) { return new JedisClusterCommand(connectionHandler, maxAttempts) { @Override public Long execute(Jedis connection) { - return connection.copy(srcKey, dstKey, params); + return connection.copy(srcKey, dstKey, replace); } }.run(2, srcKey, dstKey); } diff --git a/src/main/java/redis/clients/jedis/commands/Commands.java b/src/main/java/redis/clients/jedis/commands/Commands.java index 4e02c764d3..c303ec9d6b 100644 --- a/src/main/java/redis/clients/jedis/commands/Commands.java +++ b/src/main/java/redis/clients/jedis/commands/Commands.java @@ -28,6 +28,8 @@ public interface Commands { void copy(String srcKey, String dstKey, CopyParams params); + void copy(String srcKey, String dstKey, boolean replace); + void ping(String message); void set(String key, String value); diff --git a/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryCommands.java b/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryCommands.java index 8dd57f14b1..e5e71819f1 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryCommands.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryCommands.java @@ -21,6 +21,8 @@ public interface MultiKeyBinaryCommands { Long copy(byte[] srcKey, byte[] dstKey, CopyParams params); + Long copy(byte[] srcKey, byte[] dstKey, boolean replace); + Long del(byte[]... keys); Long unlink(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 062736ddd1..8ef9e4f377 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryJedisClusterCommands.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryJedisClusterCommands.java @@ -22,7 +22,7 @@ import java.util.Set; public interface MultiKeyBinaryJedisClusterCommands { - Long copy(byte[] srcKey, byte[] dstKey, CopyParams params); + Long copy(byte[] srcKey, byte[] dstKey, boolean replace); Long del(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 521cb5f6df..e282c25922 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyCommands.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyCommands.java @@ -25,6 +25,8 @@ public interface MultiKeyCommands { Long copy(String srcKey, String dstKey, CopyParams params); + Long copy(String srcKey, String dstKey, boolean replace); + Long del(String... keys); Long unlink(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 5d6ccd3d0b..6891f8bed2 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyJedisClusterCommands.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyJedisClusterCommands.java @@ -22,7 +22,7 @@ import java.util.Set; public interface MultiKeyJedisClusterCommands { - Long copy(String srcKey, String dstKey, CopyParams params); + Long copy(String srcKey, String dstKey, boolean replace); Long del(String... keys); From f9c194ff5547d4c80e0e5546b095da5e4534f724 Mon Sep 17 00:00:00 2001 From: dengliming Date: Mon, 22 Mar 2021 16:43:03 +0800 Subject: [PATCH 3/3] review --- .../redis/clients/jedis/BinaryClient.java | 8 ++-- .../java/redis/clients/jedis/BinaryJedis.java | 21 ++++++--- .../clients/jedis/BinaryJedisCluster.java | 6 +-- src/main/java/redis/clients/jedis/Client.java | 4 +- src/main/java/redis/clients/jedis/Jedis.java | 21 ++++++--- .../redis/clients/jedis/JedisCluster.java | 6 +-- .../clients/jedis/MultiKeyPipelineBase.java | 24 +++++++--- .../clients/jedis/commands/Commands.java | 3 +- .../commands/MultiKeyBinaryCommands.java | 5 +- .../MultiKeyBinaryJedisClusterCommands.java | 3 +- .../commands/MultiKeyBinaryRedisPipeline.java | 4 +- .../jedis/commands/MultiKeyCommands.java | 5 +- .../commands/MultiKeyCommandsPipeline.java | 4 +- .../MultiKeyJedisClusterCommands.java | 3 +- .../clients/jedis/params/CopyParams.java | 47 ------------------- .../commands/AllKindOfValuesCommandsTest.java | 9 ++-- 16 files changed, 77 insertions(+), 96 deletions(-) delete mode 100644 src/main/java/redis/clients/jedis/params/CopyParams.java diff --git a/src/main/java/redis/clients/jedis/BinaryClient.java b/src/main/java/redis/clients/jedis/BinaryClient.java index 0e5aedbf3f..04724c41c4 100644 --- a/src/main/java/redis/clients/jedis/BinaryClient.java +++ b/src/main/java/redis/clients/jedis/BinaryClient.java @@ -174,11 +174,11 @@ public void copy(byte[] srcKey, byte[] dstKey, boolean replace) { } } - public void copy(byte[] srcKey, byte[] dstKey, CopyParams params) { - if (params == null) { - sendCommand(COPY, srcKey, dstKey); + public void copy(byte[] srcKey, byte[] dstKey, int db, boolean replace) { + if (replace) { + sendCommand(COPY, srcKey, dstKey, DB.getRaw(), toByteArray(db), REPLACE.getRaw()); } else { - sendCommand(COPY, params.getByteParams(srcKey, dstKey)); + sendCommand(COPY, srcKey, dstKey, DB.getRaw(), toByteArray(db)); } } diff --git a/src/main/java/redis/clients/jedis/BinaryJedis.java b/src/main/java/redis/clients/jedis/BinaryJedis.java index 5f60ad1a04..3b0ba24f89 100644 --- a/src/main/java/redis/clients/jedis/BinaryJedis.java +++ b/src/main/java/redis/clients/jedis/BinaryJedis.java @@ -330,21 +330,30 @@ public int getDB() { * * @param srcKey the source key. * @param dstKey the destination key. - * @param params + * @param db + * @param replace * @return */ @Override - public Long copy(byte[] srcKey, byte[] dstKey, CopyParams params) { + public Boolean copy(byte[] srcKey, byte[] dstKey, int db, boolean replace) { checkIsInMultiOrPipeline(); - client.copy(srcKey, dstKey, params); - return client.getIntegerReply(); + client.copy(srcKey, dstKey, db, replace); + return BuilderFactory.BOOLEAN.build(client.getIntegerReply()); } + /** + * COPY source destination [DB destination-db] [REPLACE] + * + * @param srcKey the source key. + * @param dstKey the destination key. + * @param replace + * @return + */ @Override - public Long copy(byte[] srcKey, byte[] dstKey, boolean replace) { + public Boolean copy(byte[] srcKey, byte[] dstKey, boolean replace) { checkIsInMultiOrPipeline(); client.copy(srcKey, dstKey, replace); - return client.getIntegerReply(); + return BuilderFactory.BOOLEAN.build(client.getIntegerReply()); } /** diff --git a/src/main/java/redis/clients/jedis/BinaryJedisCluster.java b/src/main/java/redis/clients/jedis/BinaryJedisCluster.java index b96a5c34bb..02ab89f963 100644 --- a/src/main/java/redis/clients/jedis/BinaryJedisCluster.java +++ b/src/main/java/redis/clients/jedis/BinaryJedisCluster.java @@ -158,10 +158,10 @@ public Jedis getConnectionFromSlot(int slot) { } @Override - public Long copy(byte[] srcKey, byte[] dstKey, boolean replace) { - return new JedisClusterCommand(connectionHandler, maxAttempts) { + public Boolean copy(byte[] srcKey, byte[] dstKey, boolean replace) { + return new JedisClusterCommand(connectionHandler, maxAttempts) { @Override - public Long execute(Jedis connection) { + public Boolean execute(Jedis connection) { return connection.copy(srcKey, dstKey, replace); } }.runBinary(2, srcKey, dstKey); diff --git a/src/main/java/redis/clients/jedis/Client.java b/src/main/java/redis/clients/jedis/Client.java index 8b429b7ed4..8648a8cc01 100644 --- a/src/main/java/redis/clients/jedis/Client.java +++ b/src/main/java/redis/clients/jedis/Client.java @@ -65,8 +65,8 @@ public Client(final JedisSocketFactory jedisSocketFactory) { } @Override - public void copy(String srcKey, String dstKey, CopyParams params) { - copy(SafeEncoder.encode(srcKey), SafeEncoder.encode(dstKey), params); + public void copy(String srcKey, String dstKey, int db, boolean replace) { + copy(SafeEncoder.encode(srcKey), SafeEncoder.encode(dstKey), db, replace); } @Override diff --git a/src/main/java/redis/clients/jedis/Jedis.java b/src/main/java/redis/clients/jedis/Jedis.java index 1b28e3de56..a2920c7b4d 100644 --- a/src/main/java/redis/clients/jedis/Jedis.java +++ b/src/main/java/redis/clients/jedis/Jedis.java @@ -162,21 +162,30 @@ public Jedis(final JedisSocketFactory jedisSocketFactory) { * * @param srcKey the source key. * @param dstKey the destination key. - * @param params + * @param db + * @param replace * @return */ @Override - public Long copy(String srcKey, String dstKey, CopyParams params) { + public Boolean copy(String srcKey, String dstKey, int db, boolean replace) { checkIsInMultiOrPipeline(); - client.copy(srcKey, dstKey, params); - return client.getIntegerReply(); + client.copy(srcKey, dstKey, db, replace); + return BuilderFactory.BOOLEAN.build(client.getIntegerReply()); } + /** + * COPY source destination [DB destination-db] [REPLACE] + * + * @param srcKey the source key. + * @param dstKey the destination key. + * @param replace + * @return + */ @Override - public Long copy(String srcKey, String dstKey, boolean replace) { + public Boolean copy(String srcKey, String dstKey, boolean replace) { checkIsInMultiOrPipeline(); client.copy(srcKey, dstKey, replace); - return client.getIntegerReply(); + return BuilderFactory.BOOLEAN.build(client.getIntegerReply()); } /** diff --git a/src/main/java/redis/clients/jedis/JedisCluster.java b/src/main/java/redis/clients/jedis/JedisCluster.java index 57bb17ae75..35a0eb5a92 100644 --- a/src/main/java/redis/clients/jedis/JedisCluster.java +++ b/src/main/java/redis/clients/jedis/JedisCluster.java @@ -249,10 +249,10 @@ public JedisCluster(Set nodes, final JedisClientConfig clientConfig } @Override - public Long copy(String srcKey, String dstKey, boolean replace) { - return new JedisClusterCommand(connectionHandler, maxAttempts) { + public Boolean copy(String srcKey, String dstKey, boolean replace) { + return new JedisClusterCommand(connectionHandler, maxAttempts) { @Override - public Long execute(Jedis connection) { + public Boolean execute(Jedis connection) { return connection.copy(srcKey, dstKey, replace); } }.run(2, srcKey, dstKey); diff --git a/src/main/java/redis/clients/jedis/MultiKeyPipelineBase.java b/src/main/java/redis/clients/jedis/MultiKeyPipelineBase.java index 71c5106318..126376e9c3 100644 --- a/src/main/java/redis/clients/jedis/MultiKeyPipelineBase.java +++ b/src/main/java/redis/clients/jedis/MultiKeyPipelineBase.java @@ -44,15 +44,27 @@ public Response blmove(String srcKey, String dstKey, ListDirection from, } @Override - public Response copy(byte[] srcKey, byte[] dstKey, CopyParams params) { - client.copy(srcKey, dstKey, params); - return getResponse(BuilderFactory.LONG); + public Response copy(byte[] srcKey, byte[] dstKey, int db, boolean replace) { + client.copy(srcKey, dstKey, db, replace); + return getResponse(BuilderFactory.BOOLEAN); } @Override - public Response copy(String srcKey, String dstKey, CopyParams params) { - client.copy(srcKey, dstKey, params); - return getResponse(BuilderFactory.LONG); + public Response copy(byte[] srcKey, byte[] dstKey, boolean replace) { + client.copy(srcKey, dstKey, replace); + return getResponse(BuilderFactory.BOOLEAN); + } + + @Override + public Response copy(String srcKey, String dstKey, int db, boolean replace) { + client.copy(srcKey, dstKey, db, replace); + return getResponse(BuilderFactory.BOOLEAN); + } + + @Override + public Response copy(String srcKey, String dstKey, boolean replace) { + client.copy(srcKey, dstKey, replace); + return getResponse(BuilderFactory.BOOLEAN); } @Override diff --git a/src/main/java/redis/clients/jedis/commands/Commands.java b/src/main/java/redis/clients/jedis/commands/Commands.java index 0b4e157563..bdb58c7d8d 100644 --- a/src/main/java/redis/clients/jedis/commands/Commands.java +++ b/src/main/java/redis/clients/jedis/commands/Commands.java @@ -11,7 +11,6 @@ import redis.clients.jedis.args.ListDirection; import redis.clients.jedis.args.UnblockType; import redis.clients.jedis.ZParams; -import redis.clients.jedis.params.CopyParams; import redis.clients.jedis.params.GetExParams; import redis.clients.jedis.params.MigrateParams; import redis.clients.jedis.params.ClientKillParams; @@ -28,7 +27,7 @@ public interface Commands { - void copy(String srcKey, String dstKey, CopyParams params); + void copy(String srcKey, String dstKey, int db, boolean replace); void copy(String srcKey, String dstKey, boolean replace); diff --git a/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryCommands.java b/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryCommands.java index 6ae3b47383..a5d7c26862 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryCommands.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryCommands.java @@ -8,7 +8,6 @@ import redis.clients.jedis.Tuple; import redis.clients.jedis.ZParams; import redis.clients.jedis.args.ListDirection; -import redis.clients.jedis.params.CopyParams; import redis.clients.jedis.params.GeoRadiusParam; import redis.clients.jedis.params.GeoRadiusStoreParam; import redis.clients.jedis.params.XReadGroupParams; @@ -20,9 +19,9 @@ import java.util.Set; public interface MultiKeyBinaryCommands { - Long copy(byte[] srcKey, byte[] dstKey, CopyParams params); + Boolean copy(byte[] srcKey, byte[] dstKey, int db, boolean replace); - Long copy(byte[] srcKey, byte[] dstKey, boolean replace); + Boolean copy(byte[] srcKey, byte[] dstKey, boolean replace); Long del(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 5de0ff17c8..91e933b95d 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryJedisClusterCommands.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryJedisClusterCommands.java @@ -9,7 +9,6 @@ import redis.clients.jedis.SortingParams; import redis.clients.jedis.Tuple; import redis.clients.jedis.ZParams; -import redis.clients.jedis.params.CopyParams; import redis.clients.jedis.args.ListDirection; import redis.clients.jedis.params.GeoRadiusParam; import redis.clients.jedis.params.GeoRadiusStoreParam; @@ -22,7 +21,7 @@ import java.util.Set; public interface MultiKeyBinaryJedisClusterCommands { - Long copy(byte[] srcKey, byte[] dstKey, boolean replace); + Boolean copy(byte[] srcKey, byte[] dstKey, boolean replace); Long del(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 c1de87ead7..1842fa5308 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryRedisPipeline.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyBinaryRedisPipeline.java @@ -18,7 +18,9 @@ * Multikey related commands (these are split out because they are non-shardable) */ public interface MultiKeyBinaryRedisPipeline { - Response copy(byte[] srcKey, byte[] dstKey, CopyParams params); + Response copy(byte[] srcKey, byte[] dstKey, int db, boolean replace); + + Response copy(byte[] srcKey, byte[] dstKey, boolean replace); Response del(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 8b49ca0fed..552dc8d33c 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyCommands.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyCommands.java @@ -12,7 +12,6 @@ import redis.clients.jedis.Tuple; import redis.clients.jedis.ZParams; import redis.clients.jedis.args.ListDirection; -import redis.clients.jedis.params.CopyParams; import redis.clients.jedis.params.GeoRadiusParam; import redis.clients.jedis.params.GeoRadiusStoreParam; import redis.clients.jedis.params.XReadGroupParams; @@ -24,9 +23,9 @@ public interface MultiKeyCommands { - Long copy(String srcKey, String dstKey, CopyParams params); + Boolean copy(String srcKey, String dstKey, int db, boolean replace); - Long copy(String srcKey, String dstKey, boolean replace); + Boolean copy(String srcKey, String dstKey, boolean replace); Long del(String... keys); diff --git a/src/main/java/redis/clients/jedis/commands/MultiKeyCommandsPipeline.java b/src/main/java/redis/clients/jedis/commands/MultiKeyCommandsPipeline.java index faef16b1ef..164411b923 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyCommandsPipeline.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyCommandsPipeline.java @@ -20,7 +20,9 @@ * Multikey related commands (these are split out because they are non-shardable) */ public interface MultiKeyCommandsPipeline { - Response copy(String srcKey, String dstKey, CopyParams params); + Response copy(String srcKey, String dstKey, int db, boolean replace); + + Response copy(String srcKey, String dstKey, boolean replace); Response del(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 b8bc03cee0..9a76b59e72 100644 --- a/src/main/java/redis/clients/jedis/commands/MultiKeyJedisClusterCommands.java +++ b/src/main/java/redis/clients/jedis/commands/MultiKeyJedisClusterCommands.java @@ -12,7 +12,6 @@ import redis.clients.jedis.Tuple; import redis.clients.jedis.ZParams; import redis.clients.jedis.args.ListDirection; -import redis.clients.jedis.params.CopyParams; import redis.clients.jedis.params.GeoRadiusParam; import redis.clients.jedis.params.GeoRadiusStoreParam; import redis.clients.jedis.params.XReadGroupParams; @@ -23,7 +22,7 @@ import java.util.Set; public interface MultiKeyJedisClusterCommands { - Long copy(String srcKey, String dstKey, boolean replace); + Boolean copy(String srcKey, String dstKey, boolean replace); Long del(String... keys); diff --git a/src/main/java/redis/clients/jedis/params/CopyParams.java b/src/main/java/redis/clients/jedis/params/CopyParams.java deleted file mode 100644 index b0fdcd0818..0000000000 --- a/src/main/java/redis/clients/jedis/params/CopyParams.java +++ /dev/null @@ -1,47 +0,0 @@ -package redis.clients.jedis.params; - -import static redis.clients.jedis.Protocol.Keyword.DB; -import static redis.clients.jedis.Protocol.Keyword.REPLACE; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import redis.clients.jedis.Protocol; - -public class CopyParams extends Params { - - private Long destinationDb; - - private boolean replace; - - public static CopyParams copyParams() { - return new CopyParams(); - } - - public CopyParams destinationDb(long destinationDb) { - this.destinationDb = destinationDb; - return this; - } - - public CopyParams replace() { - this.replace = true; - return this; - } - - public byte[][] getByteParams(byte[] key, byte[]... args) { - List byteParams = new ArrayList<>(); - byteParams.add(key); - Collections.addAll(byteParams, args); - - if (destinationDb != null) { - byteParams.add(DB.getRaw()); - byteParams.add(Protocol.toByteArray(destinationDb)); - } - - if (replace) { - byteParams.add(REPLACE.getRaw()); - } - return byteParams.toArray(new byte[byteParams.size()][]); - } -} diff --git a/src/test/java/redis/clients/jedis/tests/commands/AllKindOfValuesCommandsTest.java b/src/test/java/redis/clients/jedis/tests/commands/AllKindOfValuesCommandsTest.java index b63d1f862d..494426c424 100644 --- a/src/test/java/redis/clients/jedis/tests/commands/AllKindOfValuesCommandsTest.java +++ b/src/test/java/redis/clients/jedis/tests/commands/AllKindOfValuesCommandsTest.java @@ -36,7 +36,6 @@ import redis.clients.jedis.ScanResult; import redis.clients.jedis.StreamEntryID; import redis.clients.jedis.args.FlushMode; -import redis.clients.jedis.params.CopyParams; import redis.clients.jedis.util.SafeEncoder; import redis.clients.jedis.exceptions.JedisDataException; @@ -944,19 +943,19 @@ public void encodeCompleteResponse() { @Test public void copy() { jedis.set("foo", "bar"); - assertEquals(1, jedis.copy("foo", "bar", null).longValue()); - assertEquals(0, jedis.copy("unknown", "bar1", null).longValue()); + assertTrue(jedis.copy("foo", "bar", false)); + assertFalse(jedis.copy("unknown", "bar1", false)); assertEquals("bar", jedis.get("bar")); // with destinationDb - assertEquals(1, jedis.copy("foo", "bar1", new CopyParams().destinationDb(2)).longValue()); + assertTrue(jedis.copy("foo", "bar1", 2, false)); jedis.select(2); assertEquals("bar", jedis.get("bar1")); // replace jedis.set("foo", "bar"); jedis.set("bar2", "b"); - assertEquals(1, jedis.copy("foo", "bar2", new CopyParams().replace()).longValue()); + assertTrue(jedis.copy("foo", "bar2", true)); assertEquals("bar", jedis.get("bar2")); } }