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

Jedis连接Redis报错:Failed to connect to any host resolved for DNS name

解决JedisConnectionException: Failed to connect to any host resolved for DNS name.问题

你的代码存在几个关键问题,导致连接失败,以下是问题分析和修复方案:

问题点分析

  • JedisPool生命周期管理错误:你用try-with-resources包裹了JedisPool,这会在try代码块执行完毕后自动关闭连接池。此时从池中获取的jedis实例已属于被关闭的池,后续调用auth和connect必然抛出连接异常。
  • 连接与认证顺序错误:从JedisPool获取的jedis实例已经处于连接状态,无需手动调用connect();且认证操作auth()必须在连接池的生命周期内执行,不能在池关闭后操作。
  • 连接池配置不合理:setMaxIdle(0)会让连接池在空闲时不保留任何连接,每次获取资源都要新建连接,不仅影响性能,还容易触发连接相关异常,建议设置合理的空闲连接数。
  • 语法错误:log.info("Redis connection was established.")末尾缺少分号,会导致编译失败。

修复后的代码

private void setupRedis(RedisCredentials credentials) {
    final GenericObjectPoolConfig<Jedis> poolConfig = new JedisPoolConfig();
    // 设置合理的空闲连接数,可根据业务调整,这里示例设置为8
    poolConfig.setMaxIdle(8);
    poolConfig.setMaxTotal(16);

    // 将JedisPool和Jedis实例的操作绑定在同一个try-with-resources块中
    try (JedisPool pool = new JedisPool(poolConfig, credentials.getIp(), credentials.getPort())) { 
        try (Jedis jedis = pool.getResource()) {
            // 获取资源后立即执行认证
            jedis.auth(credentials.getPassword());
            // 执行PING验证连接有效性
            String pong = jedis.ping();
            if ("PONG".equals(pong)) {
                log.info("Redis connection was established.");
            }
        }
    } catch (JedisException e) {
        log.error("Failed to establish Redis connection", e);
    }
}

关键修改说明

  1. 调整资源作用域:将JedisPool和Jedis的操作都放在同一个try-with-resources块中,确保资源使用完毕后正确释放,避免池关闭后操作无效实例。
  2. 修正连接逻辑:去掉多余的connect()调用,在获取jedis实例后立即执行auth(),同时增加PING验证确保连接正常。
  3. 优化连接池配置:设置合理的MaxIdle和MaxTotal值,保证连接池能高效复用连接。
  4. 添加异常捕获:捕获JedisException并打印错误日志,方便后续排查问题。
  5. 修复语法错误:补上log语句末尾的分号。

另外,请确认credentials.getIp()的值为127.0.0.1(与Redis绑定地址一致),端口为6379,密码与Redis配置的requirepass完全匹配。

内容的提问来源于stack exchange,提问作者Liam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 19:36:12