クラス RedisIndexedSessionRepository
- 実装されたすべてのインターフェース:
org.springframework.beans.factory.DisposableBean
、org.springframework.beans.factory.InitializingBean
、org.springframework.data.redis.connection.MessageListener
、FindByIndexNameSessionRepository<org.springframework.session.data.redis.RedisIndexedSessionRepository.RedisSession>
、SessionRepository<org.springframework.session.data.redis.RedisIndexedSessionRepository.RedisSession>
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
フィールドサマリー
フィールド修飾子と型フィールド説明static final StringSE
期限切れのセッションのクリーンアップジョブに使用されるデフォルトの cron 式。static final int
Spring Session によって使用されるデフォルトの Redis データベース。static final StringSE
Spring Session が使用する Redis の各キーとチャネルのデフォルトの名前空間。インターフェース org.springframework.session.FindByIndexNameSessionRepository から継承されたフィールド
PRINCIPAL_NAME_INDEX_NAME
コンストラクターのサマリー
コンストラクターコンストラクター説明RedisIndexedSessionRepository
(org.springframework.data.redis.core.RedisOperations<StringSE, ObjectSE> sessionRedisOperations) 新しいインスタンスを作成します。メソッドのサマリー
修飾子と型メソッド説明void
void
org.springframework.session.data.redis.RedisIndexedSessionRepository.RedisSession
このSessionRepository
によって永続化できる新しいSession
を作成します。void
deleteById
(StringSE sessionId) void
destroy()
org.springframework.session.data.redis.RedisIndexedSessionRepository.RedisSession
findByIndexNameAndIndexValue
(StringSE indexName, StringSE indexValue) SessionCreatedEvent
が公開されているチャネルのプレフィックスを取得します。SessionDeletedEvent
が公開されているチャネルの名前を取得します。SessionExpiredEvent
が公開されているチャネルの名前を取得します。セッションに使用されるRedisOperations
を返します。void
onMessage
(org.springframework.data.redis.connection.Message message, byte[] pattern) void
save
(org.springframework.session.data.redis.RedisIndexedSessionRepository.RedisSession session) SessionRepository.createSession()
によって作成されたSession
が確実に保存されます。void
setApplicationEventPublisher
(org.springframework.context.ApplicationEventPublisher applicationEventPublisher) SessionDestroyedEvent
の公開に使用されるApplicationEventPublisher
を設定します。void
setCleanupCron
(StringSE cleanupCron) クリーンアップ cron 式を設定します。void
setDatabase
(int database) 使用するデータベースインデックスを設定します。void
setDefaultMaxInactiveInterval
(int defaultMaxInactiveInterval) 使用すべきではありません。void
setDefaultMaxInactiveInterval
(DurationSE defaultMaxInactiveInterval) 新しく作成されたセッションが無効になるまでのリクエスト間の最大非アクティブ間隔を秒単位で設定します。void
setDefaultSerializer
(org.springframework.data.redis.serializer.RedisSerializer<ObjectSE> defaultSerializer) デフォルトの redis シリアライザーを設定します。void
setFlushMode
(FlushMode flushMode) redis フラッシュモードを設定します。void
setIndexResolver
(IndexResolver<Session> indexResolver) 使用するIndexResolver
を設定します。void
setRedisKeyNamespace
(StringSE namespace) void
setRedisSessionMapper
(BiFunctionSE<StringSE, MapSE<StringSE, ObjectSE>, MapSession> redisSessionMapper) void
setSaveMode
(SaveMode saveMode) 保存モードを設定します。void
setSessionIdGenerator
(SessionIdGenerator sessionIdGenerator) セッション ID の生成に使用するSessionIdGenerator
を設定します。クラス java.lang.ObjectSE から継承されたメソッド
clone, equalsSE, finalize, getClass, hashCode, notify, notifyAll, toString, wait, waitSE, waitSE
インターフェース org.springframework.session.FindByIndexNameSessionRepository から継承されたメソッド
findByPrincipalName
フィールドの詳細
コンストラクターの詳細
メソッドの詳細
afterPropertiesSet
public void afterPropertiesSet()- 次で指定:
- インターフェース
org.springframework.beans.factory.InitializingBean
のafterPropertiesSet
destroy
public void destroy()- 次で指定:
- インターフェース
org.springframework.beans.factory.DisposableBean
のdestroy
setApplicationEventPublisher
public void setApplicationEventPublisher(org.springframework.context.ApplicationEventPublisher applicationEventPublisher) SessionDestroyedEvent
の公開に使用されるApplicationEventPublisher
を設定します。デフォルトでは、SessionDestroyedEvent
を公開しません。- パラメーター:
applicationEventPublisher
-SessionDestroyedEvent
の公開に使用されるApplicationEventPublisher
。null にすることはできません。
setDefaultMaxInactiveInterval
新しく作成されたセッションが無効になるまでの、リクエスト間の最大非アクティブ間隔を秒単位で設定します。負の時間は、セッションがタイムアウトしないことを示します。デフォルトは 30 分です。- パラメーター:
defaultMaxInactiveInterval
- デフォルトの maxInactiveInterval
setDefaultMaxInactiveInterval
@DeprecatedSE(since="3.0.0") public void setDefaultMaxInactiveInterval(int defaultMaxInactiveInterval) 使用すべきではありません。3.0.0 以降、setDefaultMaxInactiveInterval(Duration)
を推奨新しく作成されたセッションが無効になるまでの、リクエスト間の最大非アクティブ間隔を秒単位で設定します。負の時間は、セッションがタイムアウトしないことを示します。デフォルトは 1800 (30 分です)。- パラメーター:
defaultMaxInactiveInterval
- 秒単位のデフォルトの maxInactiveInterval
setIndexResolver
使用するIndexResolver
を設定します。- パラメーター:
indexResolver
- インデックスリゾルバー
setDefaultSerializer
public void setDefaultSerializer(org.springframework.data.redis.serializer.RedisSerializer<ObjectSE> defaultSerializer) デフォルトの redis シリアライザーを設定します。JdkSerializationRedisSerializer
に基づくデフォルトのシリアライザーを置き換えます。- パラメーター:
defaultSerializer
- 新しいデフォルトの redis シリアライザー
setFlushMode
redis フラッシュモードを設定します。デフォルトのフラッシュモードはFlushMode.ON_SAVE
です。- パラメーター:
flushMode
- フラッシュモード
setSaveMode
保存モードを設定します。- パラメーター:
saveMode
- 保存モード
setCleanupCron
クリーンアップ 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
- 次で指定:
- インターフェース
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
- 次で指定:
- インターフェース
FindByIndexNameSessionRepository<org.springframework.session.data.redis.RedisIndexedSessionRepository.RedisSession>
のfindByIndexNameAndIndexValue
- パラメーター:
indexName
- インデックスの名前 (i.e.FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME
)indexValue
- 検索するインデックスの値。- 戻り値:
- 指定されたインデックス名とインデックス値を含むすべてのセッションの
Session
へのセッション ID のMap
(非null
)。結果が見つからない場合は、空のMap
が返されます。
deleteById
インターフェースからコピーされた説明:SessionRepository
- 次で指定:
- インターフェース
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.MessageListener
のonMessage
setRedisKeyNamespace
getSessionCreatedChannelPrefix
SessionCreatedEvent
が公開されているチャネルのプレフィックスを取得します。サフィックスは、作成されたセッションのセッション ID です。- 戻り値:
SessionCreatedEvent
が公開されているチャネルのプレフィックス
getSessionDeletedChannel
SessionDeletedEvent
が公開されているチャネルの名前を取得します。- 戻り値:
SessionDeletedEvent
が公開されているチャネルの名前
getSessionExpiredChannel
SessionExpiredEvent
が公開されているチャネルの名前を取得します。- 戻り値:
SessionExpiredEvent
が公開されているチャネルの名前
setSessionIdGenerator
セッション ID の生成に使用するSessionIdGenerator
を設定します。- パラメーター:
sessionIdGenerator
- 使用するSessionIdGenerator
- 導入:
- 3.2
setRedisSessionMapper
public void setRedisSessionMapper(BiFunctionSE<StringSE, MapSE<StringSE, ObjectSE>, MapSession> redisSessionMapper) - パラメーター:
redisSessionMapper
- 使用するマッパー。null にすることはできません- 導入:
- 3.2
setDefaultMaxInactiveInterval(Duration)
を推奨