|
对于最新的稳定版本,请使用 Spring Data Redis 4.0.4! |
生存时间
存储在 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 表示该对象没有关联的过期时间。 |
仓库实现确保通过 Redis 键空间通知 订阅,使用 RedisMessageListenerContainer。
当过期时间设置为正值时,将运行相应的 EXPIRE 命令。
除了持久化原始数据外,还会在 Redis 中持久化一个幻影副本,并设置为其比原始数据晚五分钟过期。
这样做是为了使 Repository 支持能够发布 RedisKeyExpiredEvent,即使原始值已被删除,Spring 的 ApplicationEventPublisher 仍会在键过期时保留过期值。
所有使用 Spring Data Redis Repository 的连接应用都会接收到过期事件。
默认情况下,在初始化应用程序时会禁用键过期监听器。
可以在 @EnableRedisRepositories 或 RedisKeyValueAdapter 中调整启动模式,以便随应用程序启动监听器,或在首次插入带有 TTL 的实体时启动监听器。
有关可能的值,请参阅 RedisKeyValueAdapter.EnableKeyspaceEvents。
RedisKeyExpiredEvent 包含已过期域对象的副本以及对应的键。
延迟或禁用过期事件监听器的启动会影响RedisKeyExpiredEvent的发布。
禁用的事件监听器不会发布过期事件。
延迟启动可能导致事件丢失,因为监听器初始化被推迟。 |
键空间通知消息监听器会在 Redis 中修改 notify-keyspace-events 设置(如果这些设置尚未配置)。
现有设置不会被覆盖,因此您必须正确配置这些设置(或将其留空)。
请注意,在 AWS ElastiCache 上 CONFIG 命令已被禁用,启用该监听器会导致错误。
为解决此问题,请将 keyspaceNotificationsConfigParameter 参数设置为空字符串。
这样可以避免使用 CONFIG 命令。 |
| Redis 仓库依赖发布/订阅(Pub/Sub)消息来清理残留的索引。 Redis 的发布/订阅消息不是持久化的。 如果应用程序处于关闭状态时某个键过期,则该过期事件不会被处理,这可能导致二级索引中仍包含对已过期对象的引用。 Redis 不支持对用作二级索引的集合(set)中的单个条目设置过期时间。 |
@EnableKeyspaceEvents(shadowCopy = OFF) 禁用幽灵副本的存储,并减少 Redis 中的数据量。RedisKeyExpiredEvent 将仅包含过期键的 id。 |