From c1a2d551ac2d3df1e58c6f1a86c5d3d7eddefe65 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Fri, 21 Feb 2020 10:53:09 +0100 Subject: [PATCH] Add support for KEEPTTL with SET #1234 --- src/main/java/io/lettuce/core/SetArgs.java | 28 +++++++++++++++++++ .../StringCommandIntegrationTests.java | 17 ++++++++--- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/src/main/java/io/lettuce/core/SetArgs.java b/src/main/java/io/lettuce/core/SetArgs.java index 651a0aca83..d29d23a2ca 100644 --- a/src/main/java/io/lettuce/core/SetArgs.java +++ b/src/main/java/io/lettuce/core/SetArgs.java @@ -33,6 +33,7 @@ public class SetArgs implements CompositeArgument { private Long px; private boolean nx = false; private boolean xx = false; + private boolean keepttl = false; /** * Builder entry points for {@link SetArgs}. @@ -86,6 +87,17 @@ public static SetArgs nx() { public static SetArgs xx() { return new SetArgs().xx(); } + + /** + * Creates new {@link SetArgs} and enabling {@literal KEEPTTL}. + * + * @return new {@link SetArgs} with {@literal KEEPTTL} enabled. + * @see SetArgs#keepttl() + * @since 5.3 + */ + public static SetArgs keepttl() { + return new SetArgs().keepttl(); + } } /** @@ -123,6 +135,18 @@ public SetArgs nx() { return this; } + /** + * Set the value and retain the existing TTL. + * + * @return {@code this} {@link SetArgs}. + * @since 5.3 + */ + public SetArgs keepttl() { + + this.keepttl = true; + return this; + } + /** * Only set the key if it already exists. * @@ -151,5 +175,9 @@ public void build(CommandArgs args) { if (xx) { args.add("XX"); } + + if (keepttl) { + args.add("KEEPTTL"); + } } } diff --git a/src/test/java/io/lettuce/core/commands/StringCommandIntegrationTests.java b/src/test/java/io/lettuce/core/commands/StringCommandIntegrationTests.java index 6912459077..fd2020c67e 100644 --- a/src/test/java/io/lettuce/core/commands/StringCommandIntegrationTests.java +++ b/src/test/java/io/lettuce/core/commands/StringCommandIntegrationTests.java @@ -15,10 +15,7 @@ */ package io.lettuce.core.commands; -import static io.lettuce.core.SetArgs.Builder.ex; -import static io.lettuce.core.SetArgs.Builder.nx; -import static io.lettuce.core.SetArgs.Builder.px; -import static io.lettuce.core.SetArgs.Builder.xx; +import static io.lettuce.core.SetArgs.Builder.*; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -39,6 +36,7 @@ import io.lettuce.core.api.sync.RedisCommands; import io.lettuce.test.KeyValueStreamingAdapter; import io.lettuce.test.LettuceExtension; +import io.lettuce.test.condition.EnabledOnCommand; /** * @author Will Glozer @@ -170,6 +168,17 @@ void set() { assertThat(redis.ttl(key) >= 19).isTrue(); } + @Test + @EnabledOnCommand("ACL") // Redis 6.0 guard + void setKeepTTL() { + + redis.set(key, value, ex(10)); + + assertThat(redis.set(key, "value2", keepttl())).isEqualTo("OK"); + assertThat(redis.get(key)).isEqualTo("value2"); + assertThat(redis.ttl(key) >= 1).isTrue(); + } + @Test void setNegativeEX() { assertThatThrownBy(() -> redis.set(key, value, ex(-10))).isInstanceOf(RedisException. class);