生存时间
存储在 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();
}
}
显式地使用 @TimeToLive
注解属性会从 Redis 中读取实际的 TTL
或 PTTL
值。-1 表示该对象没有关联的过期时间。
该仓库的实现通过 RedisMessageListenerContainer 确保了对 Redis 键空间通知 的订阅。
当过期时间被设置为一个正值时,相应的 EXPIRE
命令会被执行。除了持久化原始值之外,还会在 Redis 中持久化一个幻影副本,并将其设置为在原始值过期后五分钟过期。这样做的目的是为了让 Repository 支持发布 RedisKeyExpiredEvent,即使原始值已经被移除,每当一个键过期时,Spring 的 ApplicationEventPublisher
中都会持有已过期的值。所有使用 Spring Data Redis 存储库的已连接应用程序都会接收到过期事件。
默认情况下,应用程序初始化时,键过期监听器是禁用的。可以在 @EnableRedisRepositories
或 RedisKeyValueAdapter
中调整启动模式,以在应用程序启动时或首次插入带有 TTL 的实体时启动监听器。有关可能的值,请参阅 RedisKeyValueAdapter.EnableKeyspaceEvents。
RedisKeyExpiredEvent
持有一个已过期域对象的副本以及对应的键。
延迟或禁用过期事件监听器的启动会影响 RedisKeyExpiredEvent
的发布。禁用的事件监听器不会发布过期事件。延迟启动可能会导致事件丢失,因为监听器的初始化被延迟了。
键空间通知消息监听器会修改 Redis 中的 notify-keyspace-events
设置(如果这些设置尚未被配置)。已有的设置不会被覆盖,因此你必须正确设置这些参数(或将其留空)。请注意,在 AWS ElastiCache 中 CONFIG
命令是禁用的,启用监听器会导致错误。为了解决这个问题,将 keyspaceNotificationsConfigParameter
参数设置为空字符串,这样可以避免使用 CONFIG
命令。
Redis 的 Pub/Sub 消息不具备持久性。如果应用程序在关闭期间某个键过期了,那么过期事件将不会被处理,这可能会导致二级索引仍然包含对已过期对象的引用。
@EnableKeyspaceEvents(shadowCopy = OFF)
禁用幻象副本的存储,从而减少 Redis 中的数据大小。RedisKeyExpiredEvent
将仅包含过期键的 id
。