【问题标题】:How to bypass Redis session on Spring Boot application on Redis connection failure?如何在 Redis 连接失败时绕过 Spring Boot 应用程序上的 Redis 会话?
【发布时间】:2020-02-28 02:03:48
【问题描述】:

我已经按照一些示例应用程序和 Spring 文档在我的 Spring Boot Java 应用程序上使用 LettuceConnectionFactory 实现了 Redis 会话管理。当它可以连接到 Redis 服务器时,它工作正常。但是当连接失败时应用程序没有响应,因为它反复尝试连接。我做了很多研究以找到解决方案,但还没有找到任何东西。我的问题是,

  1. 有没有办法在重试一定次数后无法连接到 Redis 时切换到 Spring Session(甚至可以是 JDBC 会话)?
  2. 有没有办法在连接工厂中设置重试次数?我在 spring.redis 属性列表中没有看到任何属性。

感谢任何帮助。

2019 年 11 月 4 日更新

应用程序属性:


spring.session.store-type=redis
spring.session.redis.flush-mode=on-save
spring.session.redis.namespace=spring:session
spring.redis.host=*****.windows.net
spring.redis.port=6380
spring.redis.ssl=true
spring.redis.password=****************
spring.redis.timeout=5000ms
spring.redis.custom.command.timeout=1000ms

HttpSessionConfig.java:


@Configuration
@PropertySource("classpath:application.properties")
@EnableRedisHttpSession
public class HttpSessionConfig extends AbstractHttpSessionApplicationInitializer {

    Logger logger = LoggerFactory.getLogger(HttpSessionConfig.class);

    @Value("${spring.redis.host}")
    private String redisHostName;

    @Value("${spring.redis.port}")
    private int redisPort;

    @Value("${spring.redis.password}")
    private String redisPassword;

    private @Value("${spring.redis.custom.command.timeout}")
    Duration redisCommandTimeout;

    private @Value("${spring.redis.timeout}")
    Duration socketTimeout;


    @Bean
    LettuceConnectionFactory lettuceConnectionFactory() {

        final SocketOptions socketOptions = SocketOptions.builder().connectTimeout(socketTimeout).build();
    
        final ClientOptions clientOptions = ClientOptions.builder()
                .socketOptions(socketOptions)
                .build();

        LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder()
                .commandTimeout(redisCommandTimeout)
                .clientOptions(clientOptions)
                .readFrom(ReadFrom.SLAVE_PREFERRED)
                .build();
        RedisStandaloneConfiguration serverConfig = new RedisStandaloneConfiguration(redisHostName,
                redisPort);

        final LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(serverConfig,
                clientConfig);
        return lettuceConnectionFactory;
    }


    @Bean
    public RedisTemplate<Object, Object> sessionRedisTemplate() {
        final RedisTemplate<Object, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(lettuceConnectionFactory());
        return template;
    }     
 
    @Bean
    public ConfigureRedisAction configureRedisAction() {
        return ConfigureRedisAction.NO_OP;
    }
}

依赖关系:


<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-redis</artifactId>
   <version>2.1.4.RELEASE</version>
</dependency>
<dependency>
   <groupId>biz.paluch.redis</groupId>
   <artifactId>lettuce</artifactId>
   <version>3.5.0.Final</version>
</dependency>
<dependency>
   <groupId>io.lettuce</groupId>
   <artifactId>lettuce-core</artifactId>
   <version>5.1.6.RELEASE</version>
   <optional>true</optional>
</dependency>

如果需要更多详细信息,请告诉我。

【问题讨论】:

  • 你能分享一个最小可重现的例子吗?
  • @pedrohreis,我提供了更多细节。如果您需要更多详细信息,请查看并告诉我。

标签: spring-boot redis spring-session lettuce


【解决方案1】:

正如我们一样,我们正在使用 @Profile(value = "production") 用于 RedisHttpSession 和 @Profile(value = "development") 用于 DevSessionConfig

然后使用可以在application.properties中设置spring.profiles.active

【讨论】:

  • 这如何回答这个问题?显然,当无论环境如何都无法连接到 Redis 时,OP 希望以编程方式切换到数据库会话。
  • pedrohreis 是对的。 hill123455 的回答没有回答这个问题。在实现时,应用程序变得无响应,因为不断地尝试连接。我需要一种方法来切换到 Spring Session 或至少在一定时间内停止进一步的连接尝试。任何指针都会有所帮助。
猜你喜欢
  • 2022-06-27
  • 1970-01-01
  • 2022-10-13
  • 2019-04-05
  • 1970-01-01
  • 2015-05-07
  • 2020-05-29
  • 1970-01-01
  • 2020-04-04
相关资源
最近更新 更多