Spring 会话 Redis 网络会话到期通知不会延迟到应用程序再次启动?
Spring Session Redis web session expiration notifications not delayed until application is up again?
当前在 Spring Boot 2.5 Web 应用程序中使用 Spring Session Redis。
应用程序正确接收来自 Redis 的 Web 会话过期通知,但 AFAIK 仅当应用程序已启动并且 运行 当时 。似乎如果当时后端停止(崩溃、计划维护等),通知不会“保留”或“延迟”,直到后端再次启动,它们就会丢失。
在 的 https://redis.io/topics/notifications 中“如果您的 Pub/Sub 客户端断开连接并稍后重新连接,则客户端断开连接期间传送的所有事件都会丢失” 我知道这是标准的 Redis 行为。
这确实是当前的 Spring Session Redis 行为吗?
是否有推荐的解决方案来“延迟”通知?
如您所述,这是 Redis Keyspace 通知的标准行为。
如果在应用程序关闭时密钥过期,则无法处理过期事件,无法延迟通知。
在 Spring Session Data Redis 中的会话过期上下文中,这意味着如果应用程序关闭(崩溃等)时 SessionExpiredEvent
/SessionDeletedEvent
将不会触发Redis 键空间通知已发送。
如果您有依赖于这些事件的任务,这将导致问题。
这也意味着资源可能无法正确清理。
但是,从安全的角度来看,会话仍然会正确过期,用户将无法继续使用过期的会话。
如果应用程序在到期时执行关键任务,考虑到 Redis 的“即发即弃”特性,不同的数据存储可能更合适 Pub/Sub。
或者,拥有多个节点将使它们不太可能在收到通知时全部关闭。
当前在 Spring Boot 2.5 Web 应用程序中使用 Spring Session Redis。
应用程序正确接收来自 Redis 的 Web 会话过期通知,但 AFAIK 仅当应用程序已启动并且 运行 当时 。似乎如果当时后端停止(崩溃、计划维护等),通知不会“保留”或“延迟”,直到后端再次启动,它们就会丢失。
在 的 https://redis.io/topics/notifications 中“如果您的 Pub/Sub 客户端断开连接并稍后重新连接,则客户端断开连接期间传送的所有事件都会丢失” 我知道这是标准的 Redis 行为。
这确实是当前的 Spring Session Redis 行为吗? 是否有推荐的解决方案来“延迟”通知?
如您所述,这是 Redis Keyspace 通知的标准行为。
如果在应用程序关闭时密钥过期,则无法处理过期事件,无法延迟通知。
在 Spring Session Data Redis 中的会话过期上下文中,这意味着如果应用程序关闭(崩溃等)时 SessionExpiredEvent
/SessionDeletedEvent
将不会触发Redis 键空间通知已发送。
如果您有依赖于这些事件的任务,这将导致问题。
这也意味着资源可能无法正确清理。
但是,从安全的角度来看,会话仍然会正确过期,用户将无法继续使用过期的会话。
如果应用程序在到期时执行关键任务,考虑到 Redis 的“即发即弃”特性,不同的数据存储可能更合适 Pub/Sub。
或者,拥有多个节点将使它们不太可能在收到通知时全部关闭。