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