diff --git a/src/main/java/org/springframework/data/redis/connection/jedis/JedisConverters.java b/src/main/java/org/springframework/data/redis/connection/jedis/JedisConverters.java index 10f0d21c0..54a129eb5 100644 --- a/src/main/java/org/springframework/data/redis/connection/jedis/JedisConverters.java +++ b/src/main/java/org/springframework/data/redis/connection/jedis/JedisConverters.java @@ -431,15 +431,15 @@ public abstract class JedisConverters extends Converters { return paramsToUse.keepttl(); } - if (!expiration.isPersistent()) { - if (expiration.getTimeUnit() == TimeUnit.MILLISECONDS) { - return paramsToUse.px(expiration.getExpirationTime()); - } - - return paramsToUse.ex((int) expiration.getExpirationTime()); + if (expiration.isPersistent()) { + return paramsToUse; } - return params; + if (expiration.getTimeUnit() == TimeUnit.MILLISECONDS) { + return expiration.isUnixTimestamp() ? paramsToUse.pxAt(expiration.getExpirationTime()) : paramsToUse.px(expiration.getExpirationTime()); + } + + return expiration.isUnixTimestamp() ? paramsToUse.exAt(expiration.getConverted(TimeUnit.SECONDS)) : paramsToUse.ex(expiration.getConverted(TimeUnit.SECONDS)); } /** diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConverters.java b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConverters.java index 79687c4c4..aa86703ee 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConverters.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConverters.java @@ -699,11 +699,19 @@ public abstract class LettuceConverters extends Converters { } else if (!expiration.isPersistent()) { switch (expiration.getTimeUnit()) { - case SECONDS: - args.ex(expiration.getExpirationTime()); + case MILLISECONDS: + if (expiration.isUnixTimestamp()) { + args.pxAt(expiration.getConverted(TimeUnit.MILLISECONDS)); + } else { + args.px(expiration.getConverted(TimeUnit.MILLISECONDS)); + } break; default: - args.px(expiration.getConverted(TimeUnit.MILLISECONDS)); + if (expiration.isUnixTimestamp()) { + args.exAt(expiration.getConverted(TimeUnit.SECONDS)); + } else { + args.ex(expiration.getConverted(TimeUnit.SECONDS)); + } break; } } @@ -740,7 +748,7 @@ public abstract class LettuceConverters extends Converters { return args; } - if(expiration.isPersistent()) { + if (expiration.isPersistent()) { return args.persist(); } diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConvertersUnitTests.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConvertersUnitTests.java index 4bb426f4a..548233fdf 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConvertersUnitTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConvertersUnitTests.java @@ -213,6 +213,22 @@ class JedisConvertersUnitTests { assertThat(toString(JedisConverters.toSetCommandExPxArgument(Expiration.milliseconds(100)))).isEqualTo("px 100"); } + @Test // GH-2050 + void convertsExpirationToSetPXAT() { + + assertThat(JedisConverters.toSetCommandExPxArgument(Expiration.unixTimestamp(10, TimeUnit.MILLISECONDS))) + .extracting(SetParams::toString) + .isEqualTo(SetParams.setParams().pxAt(10).toString()); + } + + @Test // GH-2050 + void convertsExpirationToSetEXAT() { + + assertThat(JedisConverters.toSetCommandExPxArgument(Expiration.unixTimestamp(1, TimeUnit.MINUTES))) + .extracting(SetParams::toString) + .isEqualTo(SetParams.setParams().exAt(60).toString()); + } + @Test // DATAREDIS-316, DATAREDIS-749 void toSetCommandNxXxOptionShouldReturnNXforAbsent() { assertThat(toString(JedisConverters.toSetCommandNxXxArgument(SetOption.ifAbsent()))).isEqualTo("nx"); diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConvertersUnitTests.java b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConvertersUnitTests.java index a4354405e..917fd1e80 100644 --- a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConvertersUnitTests.java +++ b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConvertersUnitTests.java @@ -39,8 +39,10 @@ import org.springframework.data.redis.connection.RedisClusterNode.Flag; import org.springframework.data.redis.connection.RedisClusterNode.LinkState; import org.springframework.data.redis.connection.RedisStringCommands.SetOption; import org.springframework.data.redis.connection.RedisZSetCommands; +import org.springframework.data.redis.connection.jedis.JedisConverters; import org.springframework.data.redis.core.types.Expiration; import org.springframework.data.redis.core.types.RedisClientInfo; +import redis.clients.jedis.params.SetParams; /** * @author Christoph Strobl @@ -136,6 +138,20 @@ class LettuceConvertersUnitTests { assertThat((Boolean) getField(args, "xx")).isEqualTo(Boolean.FALSE); } + @Test // GH-2050 + void convertsExpirationToSetPXAT() { + + assertThatCommandArgument(LettuceConverters.toSetArgs(Expiration.unixTimestamp(10, TimeUnit.MILLISECONDS), null)) + .isEqualTo(SetArgs.Builder.pxAt(10)); + } + + @Test // GH-2050 + void convertsExpirationToSetEXAT() { + + assertThatCommandArgument(LettuceConverters.toSetArgs(Expiration.unixTimestamp(1, TimeUnit.MINUTES), null)) + .isEqualTo(SetArgs.Builder.exAt(60)); + } + @Test // DATAREDIS-316 void toSetArgsShouldSetPxForMilliseconds() {