spring 会话冲突会话

spring session collision sessions

在 spring 会话中,我们有两个应用程序使用相同的 Redis 服务器,因此有时我们会遇到无法序列化的 ClassNotFoundException,因为应用程序试图序列化由不同的服务器创建的会话应用程序。不过,有时这两种服务都会开始出现此错误。

为了缓解这个问题,我们确定使用 redisNamespace。但是假设我们有 2 项服务并且只能更新一项服务。如果我们将 redisNamespace 添加到一项服务中,这两种服务上的会话不会发生冲突吗?例如服务 A 的命名空间为 "test",而服务 B 的命名空间为默认的“”(服务 B 是否仍会尝试使用服务 A 的会话?),或者我们是否也需要更改服务 B 的命名空间?

此外,我们无法一致地重现此问题,有时 ClassNotFoundException 不会出现,有时会出现,非常感谢任何一致地重现此问题的指南。

我们使用的spring版本也是1.3。1.RELEASE也是。

redisNamespace 配置参数旨在为会话提供特定于应用程序的命名空间,以支持多个应用程序使用同一 Redis 实例来存储会话的用例。来自 1.3.x reference manual:

redisNamespace - allows configuring an application specific namespace for the sessions. Redis keys and channel ids will start with the prefix of spring:session:<redisNamespace>:.

所以你的问题的答案是肯定的——如果一个应用程序没有配置特定的命名空间,而另一个使用相同 Redis 实例的应用程序配置了,它们将使用不同的命名空间,因此不会发生冲突。

作为旁注,redisNamespace 的语义在 Spring Session 2.0 中发生了变化,因此您现在可以使用此参数来配置完整的命名空间,而不仅仅是前缀的最后一部分如 Spring 会话 1.3。来自 2.0.x reference manual:

redisNamespace - allows configuring an application specific namespace for the sessions. Redis keys and channel IDs will start with the prefix of <redisNamespace>:.