跳到主要内容

生存时间

DeepSeek V3 中英对照 Time To Live

存储在 Redis 中的对象可能仅在一定时间内有效。这对于在 Redis 中持久化短期对象特别有用,无需在它们达到生命周期结束时手动删除它们。过期时间(以秒为单位)可以通过 @RedisHash(timeToLive=…​) 设置,也可以通过使用 KeyspaceConfiguration.KeyspaceSettings 进行设置(参见 Keyspaces)。

可以通过在数字属性或方法上使用 @TimeToLive 注解来设置更灵活的过期时间。但是,不要在同一个类中同时在方法和属性上应用 @TimeToLive 注解。以下示例展示了在属性和方法上使用 @TimeToLive 注解的情况:

示例 1. 过期时间

public class TimeToLiveOnProperty {

@Id
private String id;

@TimeToLive
private Long expiration;
}

public class TimeToLiveOnMethod {

@Id
private String id;

@TimeToLive
public long getTimeToLive() {
return new Random().nextLong();
}
}
java
备注

显式地使用 @TimeToLive 注解属性会从 Redis 中读取实际的 TTLPTTL 值。-1 表示该对象没有关联的过期时间。

该仓库的实现通过 RedisMessageListenerContainer 确保了对 Redis 键空间通知 的订阅。

当过期时间被设置为一个正值时,相应的 EXPIRE 命令会被执行。除了持久化原始值之外,还会在 Redis 中持久化一个幻影副本,并将其设置为在原始值过期后五分钟过期。这样做的目的是为了让 Repository 支持发布 RedisKeyExpiredEvent,即使原始值已经被移除,每当一个键过期时,Spring 的 ApplicationEventPublisher 中都会持有已过期的值。所有使用 Spring Data Redis 存储库的已连接应用程序都会接收到过期事件。

默认情况下,应用程序初始化时,键过期监听器是禁用的。可以在 @EnableRedisRepositoriesRedisKeyValueAdapter 中调整启动模式,以在应用程序启动时或首次插入带有 TTL 的实体时启动监听器。有关可能的值,请参阅 RedisKeyValueAdapter.EnableKeyspaceEvents

RedisKeyExpiredEvent 持有一个已过期域对象的副本以及对应的键。

备注

延迟或禁用过期事件监听器的启动会影响 RedisKeyExpiredEvent 的发布。禁用的事件监听器不会发布过期事件。延迟启动可能会导致事件丢失,因为监听器的初始化被延迟了。

备注

键空间通知消息监听器会修改 Redis 中的 notify-keyspace-events 设置(如果这些设置尚未被配置)。已有的设置不会被覆盖,因此你必须正确设置这些参数(或将其留空)。请注意,在 AWS ElastiCache 中 CONFIG 命令是禁用的,启用监听器会导致错误。为了解决这个问题,将 keyspaceNotificationsConfigParameter 参数设置为空字符串,这样可以避免使用 CONFIG 命令。

备注

Redis 的 Pub/Sub 消息不具备持久性。如果应用程序在关闭期间某个键过期了,那么过期事件将不会被处理,这可能会导致二级索引仍然包含对已过期对象的引用。

备注

@EnableKeyspaceEvents(shadowCopy = OFF) 禁用幻象副本的存储,从而减少 Redis 中的数据大小。RedisKeyExpiredEvent 将仅包含过期键的 id