在spring会话中,我们有两个应用程序使用相同的redis服务器,因此,有时由于应用程序尝试序列化由其他应用程序创建的会话,因此无法序列化classnotfoundexception。有时两个服务都会出现这个错误。
为了缓解这个问题,我们已经确定使用redisNamespace
。但是,假设我们有两个服务并且只能更新一个服务。如果我们将redisNamespace
添加到一个服务中,两个服务上的会话是否不会发生冲突?例如,服务A的名称空间是“test”,而服务B的名称空间是默认的“”(服务B还会尝试使用服务A的会话吗?),还是还需要更改服务b的命名空间?
此外,我们还无法一致性地重现此问题,有时ClassNotFoundException不会出现,有时会出现,任何一致性地重新创建此问题的指导原则都将非常感谢。
我们使用的spring版本也是1.3.1.release。
最佳答案
redisNamespace
配置参数旨在为会话提供特定于应用程序的命名空间,以便支持多个应用程序使用同一个redis实例存储会话的用例。从1.3.x
reference manual开始:redisNamespace
-允许为会话配置特定于应用程序的命名空间。redis键和通道id将以前缀spring:session:<redisNamespace>:
开头。
所以您的问题的答案是肯定的——如果一个应用程序没有配置特定的名称空间,但是另一个使用同一个redis实例的应用程序配置了特定的名称空间,那么它们将使用不同的名称空间,因此不会发生冲突。
另外,spring session 2.0中redisNamespace
的语义已经更改,因此现在可以使用此参数配置完整的命名空间,而不仅仅是spring session 1.3中前缀的最后一部分。从2.0.x
reference manual开始:redisNamespace
-允许为会话配置特定于应用程序的命名空间。redis键和通道id将以前缀<redisNamespace>:
开头。