diff --git a/src/main/java/org/springframework/data/redis/core/RedisKeyValueAdapter.java b/src/main/java/org/springframework/data/redis/core/RedisKeyValueAdapter.java index a6b084b5f..ff3c9000c 100644 --- a/src/main/java/org/springframework/data/redis/core/RedisKeyValueAdapter.java +++ b/src/main/java/org/springframework/data/redis/core/RedisKeyValueAdapter.java @@ -104,6 +104,11 @@ import org.springframework.util.ObjectUtils; public class RedisKeyValueAdapter extends AbstractKeyValueAdapter implements InitializingBean, ApplicationContextAware, ApplicationListener { + /** + * Time To Live in seconds that phantom keys should live longer than the actual key. + */ + private static final int PHANTOM_KEY_TTL = 300; + private RedisOperations redisOps; private RedisConverter converter; private @Nullable RedisMessageListenerContainer messageListenerContainer; @@ -201,7 +206,7 @@ public class RedisKeyValueAdapter extends AbstractKeyValueAdapter * @see org.springframework.data.keyvalue.core.KeyValueAdapter#put(java.lang.Object, java.lang.Object, java.lang.String) */ @Override - public Object put(final Object id, Object item, String keyspace) { + public Object put(Object id, Object item, String keyspace) { RedisData rdo = item instanceof RedisData ? (RedisData) item : new RedisData(); if (!(item instanceof RedisData)) { @@ -237,7 +242,7 @@ public class RedisKeyValueAdapter extends AbstractKeyValueAdapter byte[] phantomKey = ByteUtils.concat(objectKey, BinaryKeyspaceIdentifier.PHANTOM_SUFFIX); connection.del(phantomKey); connection.hMSet(phantomKey, rdo.getBucket().rawMap()); - connection.expire(phantomKey, rdo.getTimeToLive() + 300); + connection.expire(phantomKey, rdo.getTimeToLive() + PHANTOM_KEY_TTL); } connection.sAdd(toBytes(rdo.getKeyspace()), key); @@ -473,7 +478,7 @@ public class RedisKeyValueAdapter extends AbstractKeyValueAdapter // add phantom key so values can be restored byte[] phantomKey = ByteUtils.concat(redisKey, BinaryKeyspaceIdentifier.PHANTOM_SUFFIX); connection.hMSet(phantomKey, rdo.getBucket().rawMap()); - connection.expire(phantomKey, rdo.getTimeToLive() + 300); + connection.expire(phantomKey, rdo.getTimeToLive() + PHANTOM_KEY_TTL); } else { diff --git a/src/main/java/org/springframework/data/redis/core/TimeToLiveAccessor.java b/src/main/java/org/springframework/data/redis/core/TimeToLiveAccessor.java index 0241aa74a..714e10dce 100644 --- a/src/main/java/org/springframework/data/redis/core/TimeToLiveAccessor.java +++ b/src/main/java/org/springframework/data/redis/core/TimeToLiveAccessor.java @@ -35,7 +35,7 @@ public interface TimeToLiveAccessor { /** * @param type must not be {@literal null}. * @return return {@literal true} if the entity could potentially expire. - * @since ? (depends on backport) + * @since 2.3 */ boolean isExpiringEntity(Class type); } diff --git a/src/main/java/org/springframework/data/redis/core/mapping/RedisMappingContext.java b/src/main/java/org/springframework/data/redis/core/mapping/RedisMappingContext.java index df34db1f1..7aadcc024 100644 --- a/src/main/java/org/springframework/data/redis/core/mapping/RedisMappingContext.java +++ b/src/main/java/org/springframework/data/redis/core/mapping/RedisMappingContext.java @@ -208,7 +208,7 @@ public class RedisMappingContext extends KeyValueMappingContext type = source instanceof Class ? (Class) source @@ -220,8 +220,7 @@ public class RedisMappingContext extends KeyValueMappingContext ttlProperty = resolveTtlProperty(type); if (ttlProperty != null && ttlProperty.isAnnotationPresent(TimeToLive.class)) { - - unit = ttlProperty.findAnnotation(TimeToLive.class).unit(); + unit = ttlProperty.getRequiredAnnotation(TimeToLive.class).unit(); } if (source instanceof PartialUpdate) { @@ -251,6 +250,7 @@ public class RedisMappingContext extends KeyValueMappingContext 0) { return true; } + if (resolveTtlProperty(type) != null) { return true; } + return resolveTimeMethod(type) != null; } + @Nullable private Long resolveDefaultTimeOut(Class type) { if (this.defaultTimeouts.containsKey(type)) { @@ -318,7 +321,8 @@ public class RedisMappingContext extends KeyValueMappingContext resolveTtlProperty(Class type) { if (timeoutProperties.containsKey(type)) { @@ -351,7 +355,8 @@ public class RedisMappingContext extends KeyValueMappingContext type) { + @Nullable + private Method resolveTimeMethod(Class type) { if (timeoutMethods.containsKey(type)) { return timeoutMethods.get(type); diff --git a/src/main/java/org/springframework/data/redis/core/mapping/RedisPersistentEntity.java b/src/main/java/org/springframework/data/redis/core/mapping/RedisPersistentEntity.java index eb43f2655..e9fa46a75 100644 --- a/src/main/java/org/springframework/data/redis/core/mapping/RedisPersistentEntity.java +++ b/src/main/java/org/springframework/data/redis/core/mapping/RedisPersistentEntity.java @@ -46,7 +46,7 @@ public interface RedisPersistentEntity extends KeyValuePersistentEntity extends KeyValuePersistentEntity