クラス ReactiveRedisIndexedSessionRepository
- 実装されたすべてのインターフェース:
org.springframework.beans.factory.DisposableBean
、org.springframework.beans.factory.InitializingBean
、ReactiveFindByIndexNameSessionRepository<ReactiveRedisIndexedSessionRepository.RedisSession>
、ReactiveSessionRepository<ReactiveRedisIndexedSessionRepository.RedisSession>
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 サーバーを構成した場合、削除されたセッションと期限切れのセッションはそれぞれ SessionDeletedEvent
と SessionExpiredEvent
として公開されます。有効期限
有効期限は、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
ネストされたクラスのサマリー
ネストされたクラスフィールドサマリー
フィールド修飾子と型フィールド説明static final int
Spring Session によって使用されるデフォルトの Redis データベース。static final StringSE
Spring Session が使用する Redis の各キーとチャネルのデフォルトの名前空間。インターフェース org.springframework.session.ReactiveFindByIndexNameSessionRepository から継承されたフィールド
PRINCIPAL_NAME_INDEX_NAME
コンストラクターのサマリー
コンストラクターコンストラクター説明ReactiveRedisIndexedSessionRepository
(org.springframework.data.redis.core.ReactiveRedisOperations<StringSE, ObjectSE> sessionRedisOperations, org.springframework.data.redis.core.ReactiveRedisTemplate<StringSE, StringSE> keyEventsOperations) Creates a new instance with the providedReactiveRedisOperations
.メソッドのサマリー
修飾子と型メソッド説明void
reactor.core.publisher.Mono<ReactiveRedisIndexedSessionRepository.RedisSession>
このReactiveSessionRepository
によって永続化できる新しいSession
を作成します。reactor.core.publisher.Mono<VoidSE>
deleteById
(StringSE id) void
destroy()
void
Disables the clean-up task.reactor.core.publisher.Mono<ReactiveRedisIndexedSessionRepository.RedisSession>
reactor.core.publisher.Mono<MapSE<StringSE,
ReactiveRedisIndexedSessionRepository.RedisSession>> findByIndexNameAndIndexValue
(StringSE indexName, StringSE indexValue) getSessionCreatedChannel
(StringSE sessionId) reactor.core.publisher.Mono<VoidSE>
ReactiveSessionRepository.createSession()
によって作成されたSession
が確実に保存されます。void
setCleanupInterval
(DurationSE cleanupInterval) Sets the interval that the clean-up of expired sessions task should run.void
使用するClock
SE を設定します。void
setDatabase
(int database) Sets the Redis database index used by Spring Session.void
setDefaultMaxInactiveInterval
(DurationSE defaultMaxInactiveInterval) void
setEventPublisher
(org.springframework.context.ApplicationEventPublisher eventPublisher) void
setIndexResolver
(IndexResolver<Session> indexResolver) void
setRedisKeyNamespace
(StringSE namespace) Sets the namespace for keys used by Spring Session.void
setRedisSessionMapper
(BiFunctionSE<StringSE, MapSE<StringSE, ObjectSE>, reactor.core.publisher.Mono<MapSession>> redisSessionMapper) void
setSaveMode
(SaveMode saveMode) void
setSessionIdGenerator
(SessionIdGenerator sessionIdGenerator) クラス java.lang.ObjectSE から継承されたメソッド
clone, equalsSE, finalize, getClass, hashCode, notify, notifyAll, toString, wait, waitSE, waitSE
インターフェース org.springframework.session.ReactiveFindByIndexNameSessionRepository から継承されたメソッド
findByPrincipalName
フィールドの詳細
コンストラクターの詳細
ReactiveRedisIndexedSessionRepository
public ReactiveRedisIndexedSessionRepository(org.springframework.data.redis.core.ReactiveRedisOperations<StringSE, ObjectSE> sessionRedisOperations, org.springframework.data.redis.core.ReactiveRedisTemplate<StringSE, StringSE> keyEventsOperations) Creates a new instance with the providedReactiveRedisOperations
.- パラメーター:
sessionRedisOperations
- セッションの管理に使用するReactiveRedisOperations
。null にすることはできません。keyEventsOperations
- theReactiveRedisTemplate
to use to subscribe to keyspace events. Cannot be null.
メソッドの詳細
afterPropertiesSet
- 次で指定:
- インターフェース
org.springframework.beans.factory.InitializingBean
のafterPropertiesSet
- 例外:
ExceptionSE
destroy
public void destroy()- 次で指定:
- インターフェース
org.springframework.beans.factory.DisposableBean
のdestroy
findByIndexNameAndIndexValue
public reactor.core.publisher.Mono<MapSE<StringSE,ReactiveRedisIndexedSessionRepository.RedisSession>> findByIndexNameAndIndexValue(StringSE indexName, StringSE indexValue) インターフェースからコピーされた説明:ReactiveFindByIndexNameSessionRepository
- 次で指定:
- インターフェース
ReactiveFindByIndexNameSessionRepository<ReactiveRedisIndexedSessionRepository.RedisSession>
のfindByIndexNameAndIndexValue
- パラメーター:
indexName
- インデックスの名前 (i.e.ReactiveFindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME
)indexValue
- 検索するインデックスの値。- 戻り値:
- セッション ID の
Map
(null
ではない)をSession
に
createSession
public reactor.core.publisher.Mono<ReactiveRedisIndexedSessionRepository.RedisSession> createSession()インターフェースからコピーされた説明:ReactiveSessionRepository
このReactiveSessionRepository
によって永続化できる新しいSession
を作成します。これにより、
Session
の永続化方法の最適化とカスタマイズが可能になります。例: 返された実装は変更を追跡し、保存時にデルタのみを永続化する必要があることを保証する場合があります。- 次で指定:
- インターフェース
ReactiveSessionRepository<ReactiveRedisIndexedSessionRepository.RedisSession>
のcreateSession
- 戻り値:
- この
ReactiveSessionRepository
によって永続化できる新しいSession
save
public reactor.core.publisher.Mono<VoidSE> save(ReactiveRedisIndexedSessionRepository.RedisSession session) インターフェースからコピーされた説明:ReactiveSessionRepository
ReactiveSessionRepository.createSession()
によって作成されたSession
が確実に保存されます。一部の実装では、変更を即座に保持する
Session
を返すことにより、Session
が更新されたときに保存することを選択する場合があります。この場合、このメソッドは実際には何も実行しない可能性があります。- 次で指定:
- インターフェース
ReactiveSessionRepository<ReactiveRedisIndexedSessionRepository.RedisSession>
のsave
- パラメーター:
session
- 保存するSession
- 戻り値:
- 操作完了のインジケータ
findById
public reactor.core.publisher.Mono<ReactiveRedisIndexedSessionRepository.RedisSession> findById(StringSE id) インターフェースからコピーされた説明:ReactiveSessionRepository
- 次で指定:
- インターフェース
ReactiveSessionRepository<ReactiveRedisIndexedSessionRepository.RedisSession>
のfindById
- パラメーター:
id
- ルックアップするSession.getId()
- 戻り値:
Session.getId()
によるSession
、またはSession
が見つからない場合は null。
deleteById
インターフェースからコピーされた説明:ReactiveSessionRepository
- 次で指定:
- インターフェース
ReactiveSessionRepository<ReactiveRedisIndexedSessionRepository.RedisSession>
のdeleteById
- パラメーター:
id
- 削除するSession.getId()
- 戻り値:
- 操作完了のインジケータ
setDatabase
public void setDatabase(int database) Sets the Redis database index used by Spring Session.- パラメーター:
database
- 使用するデータベースインデックス
setRedisKeyNamespace
Sets the namespace for keys used by Spring Session. Defaults to 'spring:session:'.- パラメーター:
namespace
- the namespace to set
setCleanupInterval
Sets the interval that the clean-up of expired sessions task should run. Defaults to 60 seconds. UseDuration.ZERO
SE to disable it.- パラメーター:
cleanupInterval
- the interval to use
disableCleanupTask
public void disableCleanupTask()Disables the clean-up task. This is just a shortcut to invokesetCleanupInterval(Duration)
passingDuration.ZERO
SEsetClock
Sets theClock
SE to use. Defaults toClock.systemUTC()
。- パラメーター:
clock
- 使用する監視
setDefaultMaxInactiveInterval
setSessionIdGenerator
setRedisSessionMapper
public void setRedisSessionMapper(BiFunctionSE<StringSE, MapSE<StringSE, ObjectSE>, reactor.core.publisher.Mono<MapSession>> redisSessionMapper) setSaveMode
getSessionRedisOperations
setEventPublisher
public void setEventPublisher(org.springframework.context.ApplicationEventPublisher eventPublisher) setIndexResolver
getSessionCreatedChannel
getSessionCreatedChannelPrefix
getSessionDeletedChannel
getSessionExpiredChannel