diff --git a/src/main/java/redis/clients/jedis/BinaryClient.java b/src/main/java/redis/clients/jedis/BinaryClient.java index f73fd3cff0..7c2b99c82e 100644 --- a/src/main/java/redis/clients/jedis/BinaryClient.java +++ b/src/main/java/redis/clients/jedis/BinaryClient.java @@ -143,6 +143,10 @@ public void set(final byte[] key, final byte[] value, final SetParams params) { public void get(final byte[] key) { sendCommand(GET, key); } + + public void getDel(final byte[] key) { + sendCommand(GETDEL, key); + } public void quit() { db = 0; diff --git a/src/main/java/redis/clients/jedis/BinaryJedis.java b/src/main/java/redis/clients/jedis/BinaryJedis.java index a2addc1e9b..1e5427ccb0 100644 --- a/src/main/java/redis/clients/jedis/BinaryJedis.java +++ b/src/main/java/redis/clients/jedis/BinaryJedis.java @@ -294,6 +294,22 @@ public byte[] get(final byte[] key) { client.get(key); return client.getBinaryBulkReply(); } + + /** + * Get the value of key and delete the key. This command is similar to GET, except for the fact + * that it also deletes the key on success (if and only if the key's value type is a string). + *

+ * Time complexity: O(1) + * @param key + * @return the value of key + * @since Redis 6.2 + */ + @Override + public byte[] getDel(final byte[] key) { + checkIsInMultiOrPipeline(); + client.getDel(key); + return client.getBinaryBulkReply(); + } /** * Ask the server to silently close the connection. diff --git a/src/main/java/redis/clients/jedis/BinaryJedisCluster.java b/src/main/java/redis/clients/jedis/BinaryJedisCluster.java index c7973d4c88..1f36beb2bd 100644 --- a/src/main/java/redis/clients/jedis/BinaryJedisCluster.java +++ b/src/main/java/redis/clients/jedis/BinaryJedisCluster.java @@ -151,6 +151,16 @@ public byte[] execute(Jedis connection) { } }.runBinary(key); } + + @Override + public byte[] getDel(final byte[] key) { + return new JedisClusterCommand(connectionHandler, maxAttempts) { + @Override + public byte[] execute(Jedis connection) { + return connection.getDel(key); + } + }.runBinary(key); + } @Override public Long exists(final byte[]... keys) { diff --git a/src/main/java/redis/clients/jedis/BinaryShardedJedis.java b/src/main/java/redis/clients/jedis/BinaryShardedJedis.java index 4aaa6a3c3d..7e32382c98 100644 --- a/src/main/java/redis/clients/jedis/BinaryShardedJedis.java +++ b/src/main/java/redis/clients/jedis/BinaryShardedJedis.java @@ -85,6 +85,12 @@ public byte[] get(final byte[] key) { return j.get(key); } + @Override + public byte[] getDel(final byte[] key) { + Jedis j = getShard(key); + return j.getDel(key); + } + @Override public Boolean exists(final byte[] key) { Jedis j = getShard(key); diff --git a/src/main/java/redis/clients/jedis/Client.java b/src/main/java/redis/clients/jedis/Client.java index 5e69b8f4f6..8e36c8fbeb 100644 --- a/src/main/java/redis/clients/jedis/Client.java +++ b/src/main/java/redis/clients/jedis/Client.java @@ -70,6 +70,11 @@ public void set(final String key, final String value, final SetParams params) { public void get(final String key) { get(SafeEncoder.encode(key)); } + + @Override + public void getDel(final String key) { + getDel(SafeEncoder.encode(key)); + } @Override public void exists(final String... keys) { diff --git a/src/main/java/redis/clients/jedis/Jedis.java b/src/main/java/redis/clients/jedis/Jedis.java index 2fb50c1b11..ed06df247d 100644 --- a/src/main/java/redis/clients/jedis/Jedis.java +++ b/src/main/java/redis/clients/jedis/Jedis.java @@ -210,6 +210,22 @@ public String get(final String key) { return client.getBulkReply(); } + /** + * Get the value of key and delete the key. This command is similar to GET, except for the fact + * that it also deletes the key on success (if and only if the key's value type is a string). + *

+ * Time complexity: O(1) + * @param key + * @return the value of key + * @since Redis 6.2 + */ + @Override + public String getDel(final String key) { + checkIsInMultiOrPipeline(); + client.getDel(key); + return client.getBulkReply(); + } + /** * Test if the specified keys exist. The command returns the number of keys exist. * Time complexity: O(N) diff --git a/src/main/java/redis/clients/jedis/JedisCluster.java b/src/main/java/redis/clients/jedis/JedisCluster.java index 7f9d6e3921..156bf67e83 100644 --- a/src/main/java/redis/clients/jedis/JedisCluster.java +++ b/src/main/java/redis/clients/jedis/JedisCluster.java @@ -222,6 +222,16 @@ public String execute(Jedis connection) { } }.run(key); } + + @Override + public String getDel(final String key) { + return new JedisClusterCommand(connectionHandler, maxAttempts) { + @Override + public String execute(Jedis connection) { + return connection.getDel(key); + } + }.run(key); + } @Override public Boolean exists(final String key) { diff --git a/src/main/java/redis/clients/jedis/PipelineBase.java b/src/main/java/redis/clients/jedis/PipelineBase.java index 7cc83cb20e..3e4f69763f 100644 --- a/src/main/java/redis/clients/jedis/PipelineBase.java +++ b/src/main/java/redis/clients/jedis/PipelineBase.java @@ -171,6 +171,18 @@ public Response get(final byte[] key) { return getResponse(BuilderFactory.BYTE_ARRAY); } + @Override + public Response getDel(final String key) { + getClient(key).getDel(key); + return getResponse(BuilderFactory.STRING); + } + + @Override + public Response getDel(final byte[] key) { + getClient(key).getDel(key); + return getResponse(BuilderFactory.BYTE_ARRAY); + } + @Override public Response getbit(final String key, final long offset) { getClient(key).getbit(key, offset); diff --git a/src/main/java/redis/clients/jedis/Protocol.java b/src/main/java/redis/clients/jedis/Protocol.java index e10eec4f61..70600e4350 100644 --- a/src/main/java/redis/clients/jedis/Protocol.java +++ b/src/main/java/redis/clients/jedis/Protocol.java @@ -243,7 +243,7 @@ public static final byte[] toByteArray(final double value) { } public static enum Command implements ProtocolCommand { - PING, SET, GET, QUIT, EXISTS, DEL, UNLINK, TYPE, FLUSHDB, KEYS, RANDOMKEY, RENAME, RENAMENX, + PING, SET, GET, GETDEL, QUIT, EXISTS, DEL, UNLINK, TYPE, FLUSHDB, KEYS, RANDOMKEY, RENAME, RENAMENX, RENAMEX, DBSIZE, EXPIRE, EXPIREAT, TTL, SELECT, MOVE, FLUSHALL, GETSET, MGET, SETNX, SETEX, MSET, MSETNX, DECRBY, DECR, INCRBY, INCR, APPEND, SUBSTR, HSET, HGET, HSETNX, HMSET, HMGET, HINCRBY, HEXISTS, HDEL, HLEN, HKEYS, HVALS, HGETALL, RPUSH, LPUSH, LLEN, LRANGE, LTRIM, LINDEX, diff --git a/src/main/java/redis/clients/jedis/ShardedJedis.java b/src/main/java/redis/clients/jedis/ShardedJedis.java index 210d89bd30..a950c9ebe9 100644 --- a/src/main/java/redis/clients/jedis/ShardedJedis.java +++ b/src/main/java/redis/clients/jedis/ShardedJedis.java @@ -53,6 +53,12 @@ public String get(final String key) { Jedis j = getShard(key); return j.get(key); } + + @Override + public String getDel(final String key) { + Jedis j = getShard(key); + return j.getDel(key); + } @Override public String echo(final String string) { diff --git a/src/main/java/redis/clients/jedis/commands/BinaryJedisClusterCommands.java b/src/main/java/redis/clients/jedis/commands/BinaryJedisClusterCommands.java index 242043a988..ab05382540 100644 --- a/src/main/java/redis/clients/jedis/commands/BinaryJedisClusterCommands.java +++ b/src/main/java/redis/clients/jedis/commands/BinaryJedisClusterCommands.java @@ -25,6 +25,8 @@ public interface BinaryJedisClusterCommands { byte[] get(byte[] key); + byte[] getDel(byte[] key); + Boolean exists(byte[] key); Long persist(byte[] key); diff --git a/src/main/java/redis/clients/jedis/commands/BinaryJedisCommands.java b/src/main/java/redis/clients/jedis/commands/BinaryJedisCommands.java index 740273c071..0d48304400 100644 --- a/src/main/java/redis/clients/jedis/commands/BinaryJedisCommands.java +++ b/src/main/java/redis/clients/jedis/commands/BinaryJedisCommands.java @@ -30,6 +30,8 @@ public interface BinaryJedisCommands { String set(byte[] key, byte[] value, SetParams params); byte[] get(byte[] key); + + byte[] getDel(byte[] key); Boolean exists(byte[] key); diff --git a/src/main/java/redis/clients/jedis/commands/BinaryRedisPipeline.java b/src/main/java/redis/clients/jedis/commands/BinaryRedisPipeline.java index 610dbb4ec1..1e0d7e45b2 100644 --- a/src/main/java/redis/clients/jedis/commands/BinaryRedisPipeline.java +++ b/src/main/java/redis/clients/jedis/commands/BinaryRedisPipeline.java @@ -47,6 +47,8 @@ public interface BinaryRedisPipeline { Response pexpireAt(byte[] key, long millisecondsTimestamp); Response get(byte[] key); + + Response getDel(byte[] key); Response getbit(byte[] key, long offset); diff --git a/src/main/java/redis/clients/jedis/commands/Commands.java b/src/main/java/redis/clients/jedis/commands/Commands.java index 73622f4d1b..298808097a 100644 --- a/src/main/java/redis/clients/jedis/commands/Commands.java +++ b/src/main/java/redis/clients/jedis/commands/Commands.java @@ -25,6 +25,8 @@ public interface Commands { void set(String key, String value, SetParams params); void get(String key); + + void getDel(String key); void exists(String... keys); diff --git a/src/main/java/redis/clients/jedis/commands/JedisClusterCommands.java b/src/main/java/redis/clients/jedis/commands/JedisClusterCommands.java index 57ad9bb537..17226376db 100644 --- a/src/main/java/redis/clients/jedis/commands/JedisClusterCommands.java +++ b/src/main/java/redis/clients/jedis/commands/JedisClusterCommands.java @@ -26,6 +26,8 @@ public interface JedisClusterCommands { String set(String key, String value, SetParams params); String get(String key); + + String getDel(String key); Boolean exists(String key); diff --git a/src/main/java/redis/clients/jedis/commands/JedisCommands.java b/src/main/java/redis/clients/jedis/commands/JedisCommands.java index abe702a143..42e687097b 100644 --- a/src/main/java/redis/clients/jedis/commands/JedisCommands.java +++ b/src/main/java/redis/clients/jedis/commands/JedisCommands.java @@ -34,6 +34,8 @@ public interface JedisCommands { String set(String key, String value, SetParams params); String get(String key); + + String getDel(String key); Boolean exists(String key); diff --git a/src/main/java/redis/clients/jedis/commands/RedisPipeline.java b/src/main/java/redis/clients/jedis/commands/RedisPipeline.java index 936cae0e1d..8106a2f9a5 100644 --- a/src/main/java/redis/clients/jedis/commands/RedisPipeline.java +++ b/src/main/java/redis/clients/jedis/commands/RedisPipeline.java @@ -49,6 +49,8 @@ public interface RedisPipeline { Response pexpireAt(String key, long millisecondsTimestamp); Response get(String key); + + Response getDel(String key); Response getbit(String key, long offset); diff --git a/src/test/java/redis/clients/jedis/tests/commands/StringValuesCommandsTest.java b/src/test/java/redis/clients/jedis/tests/commands/StringValuesCommandsTest.java index dc4138f117..5bb5049a4d 100644 --- a/src/test/java/redis/clients/jedis/tests/commands/StringValuesCommandsTest.java +++ b/src/test/java/redis/clients/jedis/tests/commands/StringValuesCommandsTest.java @@ -215,4 +215,15 @@ public void psetex() { long ttl = jedis.ttl("foo"); assertTrue(ttl > 0 && ttl <= 20000); } + + @Test + public void getDel() { + String status = jedis.set("foo", "bar"); + assertEquals("OK", status); + + String value = jedis.getDel("foo"); + assertEquals("bar", value); + + assertNull(jedis.get("foo")); + } } \ No newline at end of file