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); } }
关键修改说明
- 调整资源作用域:将
JedisPool和Jedis的操作都放在同一个try-with-resources块中,确保资源使用完毕后正确释放,避免池关闭后操作无效实例。 - 修正连接逻辑:去掉多余的
connect()调用,在获取jedis实例后立即执行auth(),同时增加PING验证确保连接正常。 - 优化连接池配置:设置合理的
MaxIdle和MaxTotal值,保证连接池能高效复用连接。 - 添加异常捕获:捕获
JedisException并打印错误日志,方便后续排查问题。 - 修复语法错误:补上log语句末尾的分号。
另外,请确认credentials.getIp()的值为127.0.0.1(与Redis绑定地址一致),端口为6379,密码与Redis配置的requirepass完全匹配。
内容的提问来源于stack exchange,提问作者Liam
相关产品推荐
相关产品推荐

