Java Spring应用连接启用TLS的远程Redis服务器超时问题求助
解决Spring Boot连接启用TLS的远程Redis超时问题
问题分析
从错误日志可以看到,你的应用实际使用的是Jedis客户端(JedisConnectionFactory),但你声明使用的是Lettuce,这大概率是依赖冲突导致的。另外,针对启用TLS的Redis服务器,你没有正确配置SSL相关参数,这是连接超时的核心原因。
解决方案
1. 清理依赖,确保使用Lettuce
在你的pom.xml(Maven)或build.gradle(Gradle)中排除Jedis依赖,避免冲突:
Maven示例:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <exclusions> <exclusion> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </exclusion> </exclusions> </dependency> <!-- 显式引入Lettuce依赖 --> <dependency> <groupId>io.lettuce</groupId> <artifactId>lettuce-core</artifactId> <version>6.0.4.RELEASE</version> </dependency>
Gradle示例:
implementation('org.springframework.boot:spring-boot-starter-data-redis') { exclude group: 'redis.clients', module: 'jedis' } implementation 'io.lettuce:lettuce-core:6.0.4.RELEASE'
2. 配置Lettuce的TLS连接
修改你的Redis配置类,为RedisStandaloneConfiguration启用SSL,并配置必要的SSL参数:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisStandaloneConfiguration; import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManagerFactory; import java.io.FileInputStream; import java.security.KeyStore; @Configuration public class RedisConfig { @Bean public LettuceConnectionFactory redisConnectionFactory() throws Exception { RedisStandaloneConfiguration config = new RedisStandaloneConfiguration(); config.setHostName("你的远程Redis地址"); config.setPort(6380); // TLS默认端口是6380,而非普通的6379 config.setPassword("你的Redis密码"); // 配置SSL上下文(如果使用自签名证书,需加载自定义信任store) TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); keyStore.load(new FileInputStream("path/to/truststore.jks"), "truststore密码".toCharArray()); trustManagerFactory.init(keyStore); SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, trustManagerFactory.getTrustManagers(), null); LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder() .useSsl() .sslContext(sslContext) // 生产环境请勿禁用主机名验证,仅测试环境临时使用 .disablePeerVerification() .build(); return new LettuceConnectionFactory(config, clientConfig); } }
3. 调整连接超时参数
如果超时是因为网络延迟,在Lettuce配置中增加超时时间:
LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder() .useSsl() .sslContext(sslContext) .commandTimeout(java.time.Duration.ofSeconds(10)) .shutdownTimeout(java.time.Duration.ofSeconds(2)) .build();
4. 调整健康检查超时
修改application.yml配置,延长健康检查的超时时间:
management: health: redis: enabled: true endpoint: health: timeout: 10s
关键注意点
- 确认远程Redis服务器的TLS端口(默认6380,而非普通6379)
- 如果Redis使用CA签发的正规证书,无需加载自定义信任store,JVM默认信任链会自动验证
- 生产环境禁止使用
disablePeerVerification(),需确保证书主机名与Redis地址完全匹配
内容的提问来源于stack exchange,提问作者Jessi
相关产品推荐
相关产品推荐

