有効期間
Redis に保存されたオブジェクトは、一定期間のみ有効です。これは、寿命が尽きたときに手動で削除することなく、Redis に短命のオブジェクトを永続化する場合に役立ちます。有効期限は、@RedisHash(timeToLive=…)
だけでなく、KeyspaceConfiguration.KeyspaceSettings
(Javadoc) を使用して秒単位で設定できます ( キースペースを参照)。
数値プロパティまたはメソッドのいずれかで @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 は、オブジェクトに有効期限が関連付けられていないことを示します。 |
リポジトリの実装により、RedisMessageListenerContainer
(Javadoc) を介して Redis キースペース通知 (英語) へのサブスクリプションが保証されます。
有効期限が正の値に設定されている場合、対応する EXPIRE
コマンドが実行されます。元の値が保持されるだけでなく、ファントムコピーが Redis に保持され、元の値の 5 分後に有効期限が切れるように設定されます。これにより、リポジトリサポートが RedisKeyExpiredEvent
(Javadoc) を公開できるようになり、元の値がすでに削除されている場合でも、キーの有効期限が切れるたびに、Spring の ApplicationEventPublisher
に有効期限が切れた値が保持されます。有効期限イベントは、Spring Data Redis リポジトリを使用するすべての接続アプリケーションで受信されます。
デフォルトでは、アプリケーションの初期化時にキーの有効期限リスナーは無効になっています。起動モードは、@EnableRedisRepositories
または RedisKeyValueAdapter
で調整して、アプリケーションで、または TTL を使用してエンティティを最初に挿入したときにリスナーを起動できます。可能な値については、RedisKeyValueAdapter.EnableKeyspaceEvents
(Javadoc) を参照してください。
RedisKeyExpiredEvent
は、期限切れのドメインオブジェクトのコピーとキーを保持します。
有効期限イベントリスナーの起動を遅らせるか無効にすると、RedisKeyExpiredEvent の公開に影響します。無効にされたイベントリスナーは、有効期限イベントを公開しません。起動が遅れると、リスナーの初期化が遅れるため、イベントが失われる可能性があります。 |
キースペース通知メッセージリスナーは、Redis の notify-keyspace-events 設定がまだ設定されていない場合、変更します。既存の設定は上書きされないため、これらの設定を正しく設定する(または空のままにする)必要があります。AWS ElastiCache では CONFIG が無効になっており、リスナーを有効にするとエラーが発生することに注意してください。この動作を回避するには、keyspaceNotificationsConfigParameter パラメーターを空の文字列に設定します。これにより、CONFIG コマンドの使用が防止されます。 |
Redis Pub/Sub メッセージは永続的ではありません。アプリケーションのダウン中にキーの有効期限が切れた場合、有効期限イベントは処理されません。これにより、有効期限が切れたオブジェクトへの参照を含むセカンダリインデックスが作成される可能性があります。 |
@EnableKeyspaceEvents(shadowCopy = OFF) は、ファントムコピーのストレージを無効にし、Redis 内のデータサイズを削減します。RedisKeyExpiredEvent には、期限切れのキーの id のみが含まれます。 |