Add GETEX options EXAT, PXAT

Original Pull Request: #2086
This commit is contained in:
Christoph Strobl
2021-06-28 10:23:35 +02:00
parent a53193946f
commit f0b22ad76f
8 changed files with 222 additions and 24 deletions

View File

@@ -17,6 +17,7 @@ package org.springframework.data.redis.connection;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import org.springframework.data.domain.Range;
import org.springframework.data.redis.core.types.Expiration;
@@ -58,10 +59,13 @@ public interface RedisStringCommands {
/**
* Return the value at {@code key} and expire the key by applying {@link Expiration}.
* <p />
* Use {@link Expiration#seconds(long)} for {@code EX}. <br />
* Use {@link Expiration#milliseconds(long)} for {@code PX}. <br />
* Use {@link Expiration#unixTimestamp(long, TimeUnit)} for {@code EXAT | PXAT}. <br />
*
* @param key must not be {@literal null}.
* @param expiration must not be {@literal null}.
* @param unit must not be {@literal null}.
* @return {@literal null} when key does not exist or used in pipeline / transaction.
* @see <a href="https://redis.io/commands/getex">Redis Documentation: GETEX</a>
* @since 2.6

View File

@@ -443,12 +443,13 @@ public abstract class JedisConverters extends Converters {
}
/**
* Converts a given {@link Expiration} to the according {@code GETEX} command argument.
* Converts a given {@link Expiration} to the according {@code GETEX} command argument depending on
* {@link Expiration#isUnixTimestamp()}.
* <dl>
* <dt>{@link TimeUnit#MILLISECONDS}</dt>
* <dd>{@code PX}</dd>
* <dd>{@code PX|PXAT}</dd>
* <dt>{@link TimeUnit#SECONDS}</dt>
* <dd>{@code EX}</dd>
* <dd>{@code EX|EXAT}</dd>
* </dl>
*
* @param expiration must not be {@literal null}.
@@ -464,10 +465,14 @@ public abstract class JedisConverters extends Converters {
}
if (expiration.getTimeUnit() == TimeUnit.MILLISECONDS) {
if (expiration.isUnixTimestamp()) {
return params.pxAt(expiration.getExpirationTime());
}
return params.px(expiration.getExpirationTime());
}
return params.ex((int) expiration.getExpirationTime());
return expiration.isUnixTimestamp() ? params.exAt(expiration.getConverted(TimeUnit.SECONDS))
: params.ex(expiration.getConverted(TimeUnit.SECONDS));
}
/**

View File

@@ -728,32 +728,31 @@ public abstract class LettuceConverters extends Converters {
/**
* Convert {@link Expiration} to {@link GetExArgs}.
*
* @param expiration
* @param expiration can be {@literal null}.
* @return
* @since 2.6
*/
static GetExArgs toGetExArgs(Expiration expiration) {
static GetExArgs toGetExArgs(@Nullable Expiration expiration) {
GetExArgs args = new GetExArgs();
if (expiration != null) {
if (expiration.isPersistent()) {
args.persist();
} else if (!expiration.isPersistent()) {
switch (expiration.getTimeUnit()) {
case SECONDS:
args.ex(expiration.getExpirationTime());
break;
default:
args.px(expiration.getConverted(TimeUnit.MILLISECONDS));
break;
}
}
if (expiration == null) {
return args;
}
return args;
if(expiration.isPersistent()) {
return args.persist();
}
if (expiration.getTimeUnit() == TimeUnit.MILLISECONDS) {
if (expiration.isUnixTimestamp()) {
return args.pxAt(expiration.getExpirationTime());
}
return args.px(expiration.getExpirationTime());
}
return expiration.isUnixTimestamp() ? args.exAt(expiration.getConverted(TimeUnit.SECONDS))
: args.ex(expiration.getConverted(TimeUnit.SECONDS));
}
static Converter<List<byte[]>, Long> toTimeConverter(TimeUnit timeUnit) {

View File

@@ -115,6 +115,17 @@ public class Expiration {
return new Expiration(expirationTime, TimeUnit.MILLISECONDS);
}
/**
* Creates new {@link Expiration} with the given {@literal unix timestamp} and {@link TimeUnit}.
*
* @param unixTimestamp the unix timestamp at which the key will expire.
* @param timeUnit must not be {@literal null}.
* @return new instance of {@link Expiration}.
*/
public static Expiration unixTimestamp(long unixTimestamp, TimeUnit timeUnit) {
return new ExpireAt(unixTimestamp, timeUnit);
}
/**
* Obtain an {@link Expiration} that indicates to keep the existing one. Eg. when sending a {@code SET} command.
* <p />
@@ -197,6 +208,14 @@ public class Expiration {
return false;
}
/**
* @return {@literal true} if {@link Expiration} is set to a specified Unix time at which the key will expire.
* @since 2.6
*/
public boolean isUnixTimestamp() {
return false;
}
/**
* @author Christoph Strobl
* @since 2.4
@@ -214,4 +233,19 @@ public class Expiration {
return true;
}
}
/**
* @author Christoph Strobl
* @since 2.6
*/
private static class ExpireAt extends Expiration {
private ExpireAt(long expirationTime, @Nullable TimeUnit timeUnit) {
super(expirationTime, timeUnit);
}
public boolean isUnixTimestamp() {
return true;
}
}
}