春季会议碰撞会议

时间:2018-06-20 19:57:52

标签: java spring redis spring-session

在春季会议中,我们有两个使用相同Redis服务器的应用程序,结果有时由于一个应用程序尝试对另一个应用程序创建的会话进行序列化而导致ClassNotFoundException无法序列化。有时候,这两种服务都会开始出现此错误。

为了缓解此问题,我们确定使用redisNamespace。但是可以说如果我们有2个服务并且只能更新一项服务。如果我们将redisNamespace添加到一个服务,那么在这两个服务上都不会发生会话冲突?例如服务A的名称空间为“测试”,而服务B的名称空间为默认的“”名称(服务B仍会尝试使用服务A的会话吗?),还是我们也需要更改服务B的名称空间?

我们也无法始终如一地重现此问题,有时不会出现ClassNotFoundException,有时确实会发生,因此非常感谢能始终如一地重现此问题的任何准则。

我们使用的春季版本也是1.3.1.RELEASE。

1 个答案:

答案 0 :(得分:0)

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

  

redisNamespace-允许为会话配置应用程序特定的名称空间。 Redis键和通道ID将以spring:session:<redisNamespace>:为前缀。

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

请注意,redisNamespace的语义在Spring Session 2.0中已更改,因此您现在可以使用此参数来配置完整的名称空间,而不是像Spring Session 1.3中那样仅配置前缀的最后一部分。来自2.0.x reference manual

  

redisNamespace-允许为会话配置应用程序特定的名称空间。 Redis键和通道ID将以前缀<redisNamespace>:开头。