You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 11:45:36