クラス ReactiveRedisIndexedSessionRepository

java.lang.ObjectSE
org.springframework.session.data.redis.ReactiveRedisIndexedSessionRepository
実装されたすべてのインターフェース:
org.springframework.beans.factory.DisposableBeanorg.springframework.beans.factory.InitializingBeanReactiveFindByIndexNameSessionRepository<ReactiveRedisIndexedSessionRepository.RedisSession>ReactiveSessionRepository<ReactiveRedisIndexedSessionRepository.RedisSession>

public class ReactiveRedisIndexedSessionRepository extends ObjectSE implements ReactiveSessionRepository<ReactiveRedisIndexedSessionRepository.RedisSession>, ReactiveFindByIndexNameSessionRepository<ReactiveRedisIndexedSessionRepository.RedisSession>, org.springframework.beans.factory.DisposableBean, org.springframework.beans.factory.InitializingBean
Spring Data の ReactiveRedisOperations を使用して実装された ReactiveSessionRepository

ストレージの詳細

以下のセクションでは、操作ごとに Redis がどのように更新されるかについて概説します。新しいセッションを作成する例を以下に示します。以降のセクションでは、詳細について説明します。
 HMSET spring:session:sessions:648377f7-c76f-4f45-b847-c0268bb48381 creationTime 1702400400000 maxInactiveInterval 1800 lastAccessedTime 1702400400000 sessionAttr:attrName someAttrValue sessionAttr:attrName2 someAttrValue2
 EXPIRE spring:session:sessions:648377f7-c76f-4f45-b847-c0268bb48381 2100
 APPEND spring:session:sessions:expires:648377f7-c76f-4f45-b847-c0268bb48381 ""
 EXPIRE spring:session:sessions:expires:648377f7-c76f-4f45-b847-c0268bb48381 1800
 ZADD spring:session:sessions:expirations "1.702402961162E12" "648377f7-c76f-4f45-b847-c0268bb48381"
 SADD spring:session:sessions:index:PRINCIPAL_NAME_INDEX_NAME:user "648377f7-c76f-4f45-b847-c0268bb48381"
 SADD spring:session:sessions:648377f7-c76f-4f45-b847-c0268bb48381:idx "spring:session:sessions:index:PRINCIPAL_NAME_INDEX_NAME:user"
 

セッションの保存

各セッションはハッシュとして Redis に保存されます。各セッションは、HMSET コマンドを使用して設定および更新されます。各セッションの保存方法の例を以下に示します。

 HMSET spring:session:sessions:648377f7-c76f-4f45-b847-c0268bb48381 creationTime 1702400400000 maxInactiveInterval 1800 lastAccessedTime 1702400400000 sessionAttr:attrName someAttrValue sessionAttr:attrName2 someAttrValue2
 

この例では、セッションの次のステートメントがセッションについて当てはまります。

  • セッション ID は 648377f7-c76f-4f45-b847-c0268bb48381 です
  • セッションは、1/1/1970 GMT の午前 0 時からミリ秒単位で 1702400400000 で作成されました。
  • セッションは 1800 秒(30 分)で期限切れになります。
  • セッションは、1/1/1970 GMT の真夜中からミリ秒単位で 1702400400000 で最後にアクセスされました。
  • セッションには 2 つの属性があります。1 つ目は、値が "someAttrValue" の "attrName" です。2 番目のセッション属性の名前は "attrName2" で、値は "someAttrValue2" です。

最適化された書き込み

ReactiveRedisIndexedSessionRepository.RedisSession は変更されたプロパティを追跡し、それらのプロパティのみを更新します。つまり、属性が 1 回書き込まれ、何度も読み取られる場合、その属性を 1 回書き込むだけで済みます。例: 以前のセッション属性 "attrName2" が更新されたとします。保存時に次のコードが実行されます。

 HMSET spring:session:sessions:648377f7-c76f-4f45-b847-c0268bb48381 sessionAttr:attrName2 newValue
 

SessionCreatedEvent

セッションが作成されると、"spring:session:event:0:created:648377f7-c76f-4f45-b847-c0268bb48381" のチャネルを使用して Redis にイベントが送信されます。この場合、"648377f7-c76f-4f45-b847-c0268bb48381" がセッション ID になります。イベントの本文は、作成されたセッションになります。

SessionDeletedEvent および SessionExpiredEvent

ConfigureNotifyKeyspaceEventsReactiveAction または外部構成を介して、キーの有効期限が切れたり削除されたりしたときにキースペースイベントを送信するように Redis サーバーを構成した場合、削除されたセッションと期限切れのセッションはそれぞれ SessionDeletedEventSessionExpiredEvent として公開されます。

有効期限

有効期限は、ReactiveRedisIndexedSessionRepository.RedisSession.getMaxInactiveInterval() に基づく EXPIRE コマンドを使用して各セッションに関連付けられます。例:

 EXPIRE spring:session:sessions:648377f7-c76f-4f45-b847-c0268bb48381 2100
 

設定されている有効期限は、セッションが実際に期限切れになった後 5 分であることに注意してください。これは、セッションの有効期限が切れたときにセッションの値にアクセスできるようにするために必要です。有効期限は、実際に有効期限が切れてから 5 分後にセッション自体に設定され、クリーンアップされていることを確認しますが、必要な処理を実行した後でのみです。

注意 : findById(String) メソッドは、期限切れのセッションが返されないことを保証します。つまり、セッションを使用する前に有効期限を確認する必要はありません。

Spring Session は、期限切れのキースペース通知を Redis から削除して、SessionDestroyedEvent を起動します。セッションに関連するリソースが確実にクリーンアップされるのは SessionDestroyedEvent です。例: Spring Session の WebSocket サポートを使用する場合、Redis の期限切れまたは削除イベントが、セッションに関連付けられている WebSocket 接続を閉じるトリガーになります。

有効期限は、セッションキー自体で直接追跡されません。これは、セッションデータが利用できなくなることを意味するためです。代わりに、特別なセッションの有効期限キーが使用されます。この例では、expires キーは次のとおりです。

 APPEND spring:session:sessions:expires:648377f7-c76f-4f45-b847-c0268bb48381 ""
 EXPIRE spring:session:sessions:expires:648377f7-c76f-4f45-b847-c0268bb48381 1800
 

セッションキーが削除されるか期限切れになると、キースペース通知によって実際のセッションの検索がトリガーされ、SessionDestroyedEvent が起動されます。

Redis の有効期限のみに依存する場合の問題の 1 つは、キーがアクセスされていない場合に有効期限切れイベントがいつ発生するかを Redis が保証しないことです。詳細については、Redis の有効期限ドキュメントの Redis がキーを期限切れにする方法セクションを参照してください。

期限切れのイベントが発生することが保証されていないという事実を回避するために、期限切れが予想されるときに各キーにアクセスできるようにすることができます。これは、キーの TTL が期限切れになった場合、Redis がキーを削除し、キーにアクセスしようとしたときに期限切れイベントを発生させることを意味します。

このため、各セッションの有効期限も、有効期限順に並べられたソートセットにセッション ID を保存することで追跡されます。これにより、バックグラウンドタスクが期限切れの可能性のあるセッションにアクセスして、Redis 期限切れイベントがより確定的な方法で発生するようになります。例:

 ZADD spring:session:sessions:expirations "1.702402961162E12" "648377f7-c76f-4f45-b847-c0268bb48381"
 

注意 : 場合によっては、有効期限が切れていないのにキーが期限切れであると誤って識別する競合状態が発生する可能性があるため、キーを明示的に削除しません。分散ロックを使用しないと(パフォーマンスが低下します)、有効期限マッピングの一貫性を確保する方法はありません。キーにアクセスするだけで、そのキーの TTL が期限切れになった場合にのみキーが削除されるようになります。

二次インデックス

デフォルトでは、Spring Session は、セッションに PrincipalNameIndexResolver を使用してプリンシパルにマップできる属性が含まれているかどうかを識別して、セッションのインデックスも作成します。セッションの解決されたインデックスはすべて、Redis セットに保存されます。例:
 SADD spring:session:sessions:index:PRINCIPAL_NAME_INDEX_NAME:user "648377f7-c76f-4f45-b847-c0268bb48381"
 SADD spring:session:sessions:648377f7-c76f-4f45-b847-c0268bb48381:idx "spring:session:sessions:index:PRINCIPAL_NAME_INDEX_NAME:user"
 
"spring:session:sessions:648377f7-c76f-4f45-b847-c0268bb48381:idx" Redis セットのメンバーを取得することで、特定のセッションのすべてのインデックスを確認できます。
導入:
3.3