【问题标题】:Is it possible to store session in two different stores using Spring Session and Spring Boot?是否可以使用 Spring Session 和 Spring Boot 将会话存储在两个不同的商店中?
【发布时间】:2020-03-28 07:35:13
【问题描述】:

我正在使用 redis 在我的 Spring Boot 应用程序中存储会话。我也在使用 Spring Session 库来实现这一点。我有两个不同的 redis 实例,即US redisEU redis。一旦有人进入我的应用程序(当然是在登录之后),我想将他们的会话存储在US redisEU redis 服务器中。请注意,这两个 redis 实例都是主实例,不在任何主从设置中。这就是我到目前为止的春季设置。

@EnableRedisHttpSession
@Configuration
public class RedisConfig{

}

注意:为简洁起见,删除了其他安全代码。

根据@EnableRedisHttpSession 文档,我们需要添加一个RedisConnectionFactory 实例,但默认情况下Spring Boot 会这样做。

所以现在,一旦用户登录,他们的会话存储在US redis(我在application.yml添加了美国redis相关信息)。

但是,每当会话存储在US redis 中时,我想在EU redis 服务器中复制相同的会话。我怎样才能做到这一点?我需要创建另一个RedisConnectionFactory bean 并手动保存吗?如果手动保存,如何保存?

注意:此用例可能未遵循最佳设计实践(即我们将用户会话存储在多个位置)。但是我确实理解这一点,但我确实有一个用例。

【问题讨论】:

    标签: java spring spring-boot redis spring-session


    【解决方案1】:

    复制由底层连接完成。例如,如果您将 Lettuce 与 Spring Session Redis 一起使用,那么您将使用 Master Slave setup 进行设置。在 Spring 中,您可以参考文档的Connecting to Redis 部分。

    Spring Boot 提供了通过属性设置主/从的简单机制。这个article 有一个很好的总结。简而言之,将属性添加到 application.yml

    redis:
      master:
        host: localhost
        port: 6379
      slaves:
        - host: localhost
          port: 16379
        - host: localhost
          port: 26379
    

    【讨论】:

      【解决方案2】:

      有一个内置的解决方案,但您可以随时调整 spring 代码,或者在您编写时向远程 Redis 发送显式 set

      您可能需要考虑使用一些Active-Active 复制机制,例如CRDT

      【讨论】:

        猜你喜欢
        • 2018-12-16
        • 2019-10-15
        • 2015-06-13
        • 2018-12-14
        • 2015-12-23
        • 2020-09-26
        • 1970-01-01
        • 2015-10-15
        • 1970-01-01
        相关资源
        最近更新 更多