存活时间
存储在 Redis 中的对象可能仅在特定时间内有效。这对于在 Redis 中持久化生命周期短暂的对象特别有用,无需在它们到期时手动删除。过期时间(以秒为单位)可以使用 @RedisHash(timeToLive=…)
设置,也可以通过使用 KeyspaceConfiguration.KeyspaceSettings
设置(参见键空间)。
更灵活的过期时间可以通过在数字类型属性或方法上使用 @TimeToLive
注解来设置。但是,请不要在同一个类中的方法和属性上同时应用 @TimeToLive
。以下示例展示了在属性和方法上使用 @TimeToLive
注解
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 表示对象没有关联的过期时间。 |
Repository 实现通过 RedisMessageListenerContainer
确保订阅 Redis 键空间通知。
当过期时间设置为正值时,将运行相应的 EXPIRE
命令。除了持久化原始对象外,还会将一个幽灵副本(phantom copy)持久化到 Redis 中,并将其设置为在原始对象过期后五分钟过期。这样做是为了使 Repository 支持能够在键过期时向 Spring 的 ApplicationEventPublisher
发布 RedisKeyExpiredEvent
(其中包含已过期对象的值),即使原始值已经被移除。使用 Spring Data Redis repositories 的所有连接应用程序都会接收到过期事件。
默认情况下,应用程序初始化时会禁用键过期监听器。可以在 @EnableRedisRepositories
或 RedisKeyValueAdapter
中调整启动模式,使其随应用程序启动或在首次插入带有 TTL 的实体时启动监听器。有关可能的值,请参阅 RedisKeyValueAdapter.EnableKeyspaceEvents
。
RedisKeyExpiredEvent
包含过期域对象的副本以及键。
延迟或禁用过期事件监听器的启动会影响 RedisKeyExpiredEvent 的发布。禁用的事件监听器不会发布过期事件。延迟启动可能因为监听器初始化延迟而导致事件丢失。 |
键空间通知消息监听器会修改 Redis 中的 notify-keyspace-events 设置,如果这些设置尚未配置。现有设置不会被覆盖,因此您必须正确设置这些参数(或留空)。请注意,AWS ElastiCache 上禁用了 CONFIG 命令,启用监听器会导致错误。为了解决此问题,将 keyspaceNotificationsConfigParameter 参数设置为空字符串。这可以避免使用 CONFIG 命令。 |
Redis 发布/订阅消息不是持久化的。如果在应用程序关闭期间键过期,则不会处理过期事件,这可能导致二级索引包含对过期对象的引用。 |
@EnableKeyspaceEvents(shadowCopy = OFF) 会禁用幽灵副本的存储,从而减少 Redis 中的数据大小。RedisKeyExpiredEvent 将仅包含过期键的 id 。 |