クラス RedisIndexedSessionRepository

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

public class RedisIndexedSessionRepository extends ObjectSE implements FindByIndexNameSessionRepository<org.springframework.session.data.redis.RedisIndexedSessionRepository.RedisSession>, org.springframework.data.redis.connection.MessageListener, org.springframework.beans.factory.InitializingBean, org.springframework.beans.factory.DisposableBean

Spring Data の RedisOperations を使用して実装された SessionRepository。Web 環境では、これは通常 SessionRepositoryFilter と組み合わせて使用されます。この実装は、MessageListener を実装することにより、SessionDeletedEvent および SessionExpiredEvent をサポートします。

新しいインスタンスの作成

新しいインスタンスを作成する方法の典型的な例を以下に示します。
 RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();

 // ... configure redisTemplate ...

 RedisIndexedSessionRepository redisSessionRepository =
         new RedisIndexedSessionRepository(redisTemplate);
 

RedisTemplate の作成方法の詳細については、 Spring Data Redis リファレンスを参照してください。

ストレージの詳細

以下のセクションでは、操作ごとに Redis がどのように更新されるかについて概説します。新しいセッションを作成する例を以下に示します。以降のセクションでは、詳細について説明します。
 HMSET spring:session:sessions:33fdd1b6-b496-4b33-9f7d-df96679d32fe creationTime 1404360000000 maxInactiveInterval 1800 lastAccessedTime 1404360000000 sessionAttr:attrName someAttrValue sessionAttr:attrName2 someAttrValue2
 EXPIRE spring:session:sessions:33fdd1b6-b496-4b33-9f7d-df96679d32fe 2100
 APPEND spring:session:sessions:expires:33fdd1b6-b496-4b33-9f7d-df96679d32fe ""
 EXPIRE spring:session:sessions:expires:33fdd1b6-b496-4b33-9f7d-df96679d32fe 1800
 SADD spring:session:expirations:1439245080000 expires:33fdd1b6-b496-4b33-9f7d-df96679d32fe
 EXPIRE spring:session:expirations:1439245080000 2100
 

セッションの保存

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

 HMSET spring:session:sessions:33fdd1b6-b496-4b33-9f7d-df96679d32fe creationTime 1404360000000 maxInactiveInterval 1800 lastAccessedTime 1404360000000 sessionAttr:attrName someAttrValue sessionAttr:attrName2 someAttrValue2
 

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

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

最適化された書き込み

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

 HMSET spring:session:sessions:33fdd1b6-b496-4b33-9f7d-df96679d32fe sessionAttr:attrName2 newValue
 

SessionCreatedEvent

セッションが作成されると、イベントが "spring:session:channel:created:33fdd1b6-b496-4b33-9f7d-df96679d32fe" のチャネルで Redis に送信され、"33fdd1b6-b496-4b33-9f7d-df96679d32fe" がセッションになります。id。イベントの本文は、作成されたセッションになります。

MessageListener として登録されている場合、RedisIndexedSessionRepository は Redis メッセージを SessionCreatedEvent に変換します。

有効期限

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

 EXPIRE spring:session:sessions:33fdd1b6-b496-4b33-9f7d-df96679d32fe 2100
 

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

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

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

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

 APPEND spring:session:sessions:expires:33fdd1b6-b496-4b33-9f7d-df96679d32fe ""
 EXPIRE spring:session:sessions:expires:33fdd1b6-b496-4b33-9f7d-df96679d32fe 1800
 

セッションの有効期限が切れるキーが削除または期限切れになると、キースペース通知が実際のセッションのルックアップをトリガーし、SessionDestroyedEvent が起動されます。

Redis の有効期限のみに依存する場合の問題の 1 つは、キーにアクセスしていない場合に Redis が期限切れのイベントがいつ発生するかを保証しないことです。具体的には、Redis が期限切れのキーをクリーンアップするために使用するバックグラウンドタスクは優先度の低いタスクであり、キーの期限切れをトリガーしない場合があります。詳細については、Redis ドキュメントの期限切れのイベントのタイミングセクションを参照してください。

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

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

 SADD spring:session:expirations:1439245080000 expires:33fdd1b6-b496-4b33-9f7d-df96679d32fe
 EXPIRE spring:session:expirations:1439245080000 2100
 

次に、バックグラウンドタスクはこれらのマッピングを使用して、各セッションの有効期限キーを明示的にリクエストします。キーを削除するのではなくアクセスすることで、TTL が期限切れになった場合にのみ Redis がキーを削除するようにします。

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

導入:
2.2.0
  • フィールドの詳細

    • DEFAULT_CLEANUP_CRON

      public static final StringSE DEFAULT_CLEANUP_CRON
      期限切れのセッションのクリーンアップジョブに使用されるデフォルトの cron 式。
      関連事項:
    • DEFAULT_DATABASE

      public static final int DEFAULT_DATABASE
      Spring Session によって使用されるデフォルトの Redis データベース。
      関連事項:
    • DEFAULT_NAMESPACE

      public static final StringSE DEFAULT_NAMESPACE
      Spring Session が使用する Redis の各キーとチャネルのデフォルトの名前空間。
      関連事項:
  • コンストラクターの詳細

    • RedisIndexedSessionRepository

      public RedisIndexedSessionRepository(org.springframework.data.redis.core.RedisOperations<StringSE,ObjectSE> sessionRedisOperations)
      新しいインスタンスを作成します。例については、クラスレベルの javadoc を参照してください。
      パラメーター:
      sessionRedisOperations - セッションの管理に使用する RedisOperations。null にすることはできません。
  • メソッドの詳細

    • afterPropertiesSet

      public void afterPropertiesSet()
      次で指定:
      インターフェース org.springframework.beans.factory.InitializingBeanafterPropertiesSet 
    • destroy

      public void destroy()
      次で指定:
      インターフェース org.springframework.beans.factory.DisposableBeandestroy 
    • setApplicationEventPublisher

      public void setApplicationEventPublisher(org.springframework.context.ApplicationEventPublisher applicationEventPublisher)
      SessionDestroyedEvent の公開に使用される ApplicationEventPublisher を設定します。デフォルトでは、SessionDestroyedEvent を公開しません。
      パラメーター:
      applicationEventPublisher - SessionDestroyedEvent の公開に使用される ApplicationEventPublisher。null にすることはできません。
    • setDefaultMaxInactiveInterval

      public void setDefaultMaxInactiveInterval(DurationSE defaultMaxInactiveInterval)
      新しく作成されたセッションが無効になるまでの、リクエスト間の最大非アクティブ間隔を秒単位で設定します。負の時間は、セッションがタイムアウトしないことを示します。デフォルトは 30 分です。
      パラメーター:
      defaultMaxInactiveInterval - デフォルトの maxInactiveInterval
    • setDefaultMaxInactiveInterval

      @DeprecatedSE(since="3.0.0") public void setDefaultMaxInactiveInterval(int defaultMaxInactiveInterval)
      使用すべきではありません。
      3.0.0 以降、setDefaultMaxInactiveInterval(Duration) を推奨
      新しく作成されたセッションが無効になるまでの、リクエスト間の最大非アクティブ間隔を秒単位で設定します。負の時間は、セッションがタイムアウトしないことを示します。デフォルトは 1800 (30 分です)。
      パラメーター:
      defaultMaxInactiveInterval - 秒単位のデフォルトの maxInactiveInterval
    • setIndexResolver

      public void setIndexResolver(IndexResolver<Session> indexResolver)
      使用する IndexResolver を設定します。
      パラメーター:
      indexResolver - インデックスリゾルバー
    • setDefaultSerializer

      public void setDefaultSerializer(org.springframework.data.redis.serializer.RedisSerializer<ObjectSE> defaultSerializer)
      デフォルトの redis シリアライザーを設定します。JdkSerializationRedisSerializer に基づくデフォルトのシリアライザーを置き換えます。
      パラメーター:
      defaultSerializer - 新しいデフォルトの redis シリアライザー
    • setFlushMode

      public void setFlushMode(FlushMode flushMode)
      redis フラッシュモードを設定します。デフォルトのフラッシュモードは FlushMode.ON_SAVE です。
      パラメーター:
      flushMode - フラッシュモード
    • setSaveMode

      public void setSaveMode(SaveMode saveMode)
      保存モードを設定します。
      パラメーター:
      saveMode - 保存モード
    • setCleanupCron

      public void setCleanupCron(StringSE cleanupCron)
      クリーンアップ cron 式を設定します。
      パラメーター:
      cleanupCron - クリーンアップ cron 式
      導入:
      3.0.0
      関連事項:
      • CronExpression
      • Scheduled.CRON_DISABLED
    • setDatabase

      public void setDatabase(int database)
      使用するデータベースインデックスを設定します。デフォルトは DEFAULT_DATABASE です。
      パラメーター:
      database - 使用するデータベースインデックス
    • getSessionRedisOperations

      public org.springframework.data.redis.core.RedisOperations<StringSE,ObjectSE> getSessionRedisOperations()
      セッションに使用される RedisOperations を返します。
      戻り値:
      セッションに使用される RedisOperations 
    • save

      public void save(org.springframework.session.data.redis.RedisIndexedSessionRepository.RedisSession session)
      インターフェースからコピーされた説明: SessionRepository
      SessionRepository.createSession() によって作成された Session が確実に保存されます。

      一部の実装では、変更を即座に保持する Session を返すことにより、Session が更新されたときに保存することを選択する場合があります。この場合、このメソッドは実際には何も実行しない可能性があります。

      次で指定:
      インターフェース SessionRepository<org.springframework.session.data.redis.RedisIndexedSessionRepository.RedisSession>save 
      パラメーター:
      session - 保存する Session
    • cleanUpExpiredSessions

      public void cleanUpExpiredSessions()
    • findById

      public org.springframework.session.data.redis.RedisIndexedSessionRepository.RedisSession findById(StringSE id)
      インターフェースからコピーされた説明: SessionRepository
      Session.getId() によって Session を取得するか、Session が見つからない場合は null を取得します。
      次で指定:
      インターフェース SessionRepository<org.springframework.session.data.redis.RedisIndexedSessionRepository.RedisSession>findById 
      パラメーター:
      id - ルックアップする Session.getId()
      戻り値:
      Session.getId() による Session、または Session が見つからない場合は null。
    • findByIndexNameAndIndexValue

      public MapSE<StringSE,org.springframework.session.data.redis.RedisIndexedSessionRepository.RedisSession> findByIndexNameAndIndexValue(StringSE indexName, StringSE indexValue)
      インターフェースからコピーされた説明: FindByIndexNameSessionRepository
      指定されたインデックス名インデックス値を含むすべてのセッションの Session に対するセッション ID の MapSE を検索します。
      次で指定:
      インターフェース FindByIndexNameSessionRepository<org.springframework.session.data.redis.RedisIndexedSessionRepository.RedisSession>findByIndexNameAndIndexValue 
      パラメーター:
      indexName - インデックスの名前 (i.e. FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME )
      indexValue - 検索するインデックスの値。
      戻り値:
      指定されたインデックス名とインデックス値を含むすべてのセッションの Session へのセッション ID の Map (非 null)。結果が見つからない場合は、空の Map が返されます。
    • deleteById

      public void deleteById(StringSE sessionId)
      インターフェースからコピーされた説明: SessionRepository
      指定された Session.getId()Session を削除するか、Session が見つからない場合は何もしません。
      次で指定:
      インターフェース SessionRepository<org.springframework.session.data.redis.RedisIndexedSessionRepository.RedisSession>deleteById 
      パラメーター:
      sessionId - 削除する Session.getId()
    • createSession

      public org.springframework.session.data.redis.RedisIndexedSessionRepository.RedisSession createSession()
      インターフェースからコピーされた説明: SessionRepository
      この SessionRepository によって永続化できる新しい Session を作成します。

      これにより、Session の永続化方法の最適化とカスタマイズが可能になります。例: 返された実装は変更を追跡し、保存時にデルタのみを永続化する必要があることを保証する場合があります。

      次で指定:
      インターフェース SessionRepository<org.springframework.session.data.redis.RedisIndexedSessionRepository.RedisSession>createSession 
      戻り値:
      この SessionRepository によって永続化できる新しい Session
    • onMessage

      public void onMessage(org.springframework.data.redis.connection.Message message, byte[] pattern)
      次で指定:
      インターフェース org.springframework.data.redis.connection.MessageListeneronMessage 
    • setRedisKeyNamespace

      public void setRedisKeyNamespace(StringSE namespace)
    • getSessionCreatedChannelPrefix

      public StringSE getSessionCreatedChannelPrefix()
      SessionCreatedEvent が公開されているチャネルのプレフィックスを取得します。サフィックスは、作成されたセッションのセッション ID です。
      戻り値:
      SessionCreatedEvent が公開されているチャネルのプレフィックス
    • getSessionDeletedChannel

      public StringSE getSessionDeletedChannel()
      SessionDeletedEvent が公開されているチャネルの名前を取得します。
      戻り値:
      SessionDeletedEvent が公開されているチャネルの名前
    • getSessionExpiredChannel

      public StringSE getSessionExpiredChannel()
      SessionExpiredEvent が公開されているチャネルの名前を取得します。
      戻り値:
      SessionExpiredEvent が公開されているチャネルの名前
    • setSessionIdGenerator

      public void setSessionIdGenerator(SessionIdGenerator sessionIdGenerator)
      セッション ID の生成に使用する SessionIdGenerator を設定します。
      パラメーター:
      sessionIdGenerator - 使用する SessionIdGenerator
      導入:
      3.2
    • setRedisSessionMapper

      public void setRedisSessionMapper(BiFunctionSE<StringSE,MapSE<StringSE,ObjectSE>,MapSession> redisSessionMapper)
      MapSession を ReactiveRedisSessionRepository.RedisSession にマップするために使用される BiFunctionSE を設定します。
      パラメーター:
      redisSessionMapper - 使用するマッパー。null にすることはできません
      導入:
      3.2