【发布时间】:2020-02-28 02:03:48
【问题描述】:
我已经按照一些示例应用程序和 Spring 文档在我的 Spring Boot Java 应用程序上使用 LettuceConnectionFactory 实现了 Redis 会话管理。当它可以连接到 Redis 服务器时,它工作正常。但是当连接失败时应用程序没有响应,因为它反复尝试连接。我做了很多研究以找到解决方案,但还没有找到任何东西。我的问题是,
- 有没有办法在重试一定次数后无法连接到 Redis 时切换到 Spring Session(甚至可以是 JDBC 会话)?
- 有没有办法在连接工厂中设置重试次数?我在 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