存活时间

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

更灵活的过期时间可以通过在数字类型属性或方法上使用 @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 中读取实际的 TTLPTTL 值。-1 表示对象没有关联的过期时间。

Repository 实现通过 RedisMessageListenerContainer 确保订阅 Redis 键空间通知

当过期时间设置为正值时,将运行相应的 EXPIRE 命令。除了持久化原始对象外,还会将一个幽灵副本(phantom copy)持久化到 Redis 中,并将其设置为在原始对象过期后五分钟过期。这样做是为了使 Repository 支持能够在键过期时向 Spring 的 ApplicationEventPublisher 发布 RedisKeyExpiredEvent(其中包含已过期对象的值),即使原始值已经被移除。使用 Spring Data Redis repositories 的所有连接应用程序都会接收到过期事件。

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

RedisKeyExpiredEvent 包含过期域对象的副本以及键。

延迟或禁用过期事件监听器的启动会影响 RedisKeyExpiredEvent 的发布。禁用的事件监听器不会发布过期事件。延迟启动可能因为监听器初始化延迟而导致事件丢失。
键空间通知消息监听器会修改 Redis 中的 notify-keyspace-events 设置,如果这些设置尚未配置。现有设置不会被覆盖,因此您必须正确设置这些参数(或留空)。请注意,AWS ElastiCache 上禁用了 CONFIG 命令,启用监听器会导致错误。为了解决此问题,将 keyspaceNotificationsConfigParameter 参数设置为空字符串。这可以避免使用 CONFIG 命令。
Redis 发布/订阅消息不是持久化的。如果在应用程序关闭期间键过期,则不会处理过期事件,这可能导致二级索引包含对过期对象的引用。
@EnableKeyspaceEvents(shadowCopy = OFF) 会禁用幽灵副本的存储,从而减少 Redis 中的数据大小。RedisKeyExpiredEvent 将仅包含过期键的 id