Redis源码阅读--Jedis中close方法详解

本文内容主要是准对Jedis中的close()方法进行解释,以及在开发中所遇到的坑

close()方法的作用

自Jedis3.0版本之后jedisPool.returnResource()被选择性弃用,而官方则重写close()方法来进行对上述方法进行替代。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Override
public void close() {
if (dataSource != null) {
Pool<Jedis> pool = this.dataSource;
this.dataSource = null;
if (client.isBroken()) {
pool.returnBrokenResource(this);
} else {
pool.returnResource(this);
}
} else {
super.close();
}
}

我们通过阅读close()的源码可以发现这个方法的的功能十分强大,它包含了jedispool.returnBrokenResource()和jedispool.returnResource()两个释放资源的方法,这也是官方决定弃用之前方法的原因。

我们知道jedisPool是一个资源池,每当我们从资源池中借走一个连接的时候资源池中就会少一个连接,当最后资源池中没有连接时,会导致后面的用户处于等待状态,又由于redis通常被拿来做身份权限验证,所以资源更加宝贵。close()方法就是把资源归还的方法,只有及时归还资源才能更好的响应用户的请求。

close()方法注意事项

有的同学在使用Jedis时可能会发现Jedis包中没有提供close()方法,不要着急,这是因为你Jedis包版本太旧的原因,应将Jedis升级为3.0级以上就可以看到此方法。还有的同学发现,即使导入了最新版本的Jedis包但是依旧没有close()方法,此时可以考虑两个问题。(1)旧版本Jedis包没有清理干净,此时检查一下maven和Libraries。(2)项目没有更新,一般STS会出现这个问题,解决办法刷新项目

-->