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

使用Jedis操作Redis时是否需要调用jedis.close()?

关于Jedis客户端连接是否需要手动关闭的疑问

我是Java开发新手,目前使用Jedis作为Redis Java客户端库,在方法内部创建Jedis对象并调用其API获取Redis的服务器、内存、客户端及统计信息。我的疑问是:由于Jedis对象是在方法内创建的,它会自动销毁吗?是否需要调用jedis.close()来关闭客户端连接?如果需要,原因是什么?

相关代码如下:

class Information{
 public void redisdetails(){
 Jedis jedis = new Jedis("localhost", 6379);
 Map<String, Object> info = new HashMap<>();
 info.put("server", jedis.info("server"));
 info.put("memory", jedis.info("memory"));
 info.put("clients", jedis.info("clients"));
 info.put("stats", jedis.info("stats"));
 }
}

嗨,作为经常用Jedis做Redis开发的人,我来给你把这个问题讲明白:

1. 划重点:Jedis对象不会自动关闭连接,必须手动处理

首先要明确:Jedis对象在方法执行完毕后会被Java垃圾回收机制回收,但它持有的Redis TCP连接不会自动关闭。Redis服务器能承载的客户端连接数是有限的,如果大量连接只创建不关闭,很快就会耗尽Redis的连接资源,导致新请求无法建立连接,甚至触发maxclients限制的报错。

2. 为什么一定要调用jedis.close()?

  • 连接是稀缺资源:Redis默认允许的并发连接数大概是10000左右(可配置),如果不主动关闭连接,这些空闲连接会一直占用资源,直到Redis主动超时断开(默认超时300秒),这段时间里的资源完全是浪费的。
  • 底层实现逻辑:Jedis是基于Socket和Redis建立TCP连接的,Socket连接不会随着Jedis对象被GC而自动释放,必须主动调用close()方法来关闭Socket,同时通知Redis服务器回收该连接。

3. 正确的代码写法:优先用try-with-resources

Java 7及以上推荐用try-with-resources语法,它会自动帮你关闭资源,不用手动写close(),就算代码抛出异常也能保证连接被关闭,安全又简洁:

class Information{
 public void redisdetails(){
     // try-with-resources会自动关闭Jedis对象
     try (Jedis jedis = new Jedis("localhost", 6379)) {
         Map<String, Object> info = new HashMap<>();
         info.put("server", jedis.info("server"));
         info.put("memory", jedis.info("memory"));
         info.put("clients", jedis.info("clients"));
         info.put("stats", jedis.info("stats"));
     }
 }
}

如果你的项目还在用Java 6及以下,那一定要在finally块里手动调用close(),避免异常导致连接泄漏:

class Information{
 public void redisdetails(){
     Jedis jedis = null;
     try {
         jedis = new Jedis("localhost", 6379);
         Map<String, Object> info = new HashMap<>();
         info.put("server", jedis.info("server"));
         info.put("memory", jedis.info("memory"));
         info.put("clients", jedis.info("clients"));
         info.put("stats", jedis.info("stats"));
     } finally {
         if (jedis != null) {
             jedis.close();
         }
     }
 }
}

额外建议:生产环境用连接池更靠谱

其实在实际生产中,我们很少直接创建单个Jedis对象,而是用JedisPool(连接池)来管理连接。连接池可以复用连接,避免频繁创建销毁连接的性能开销,还能统一控制连接数量。不过不管是单个Jedis还是连接池,用完后都要正确释放/归还连接哦。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:09:36