现阶段,互联网越来越热,高并发的设计越来越高,大多数开发者都开始使用redis作为中间件,用以解决高并发的问题。jedis作为redis的客户端,使用也是越来越频繁。很多开发者都注意到了无论是在单机模式还是分布式模式下,jedis获得链接完成操作后,都必须主动归还(也就是做链接的关闭)动作。为什么呢?
查看jedis源码不难发现其缘由。
public class Jedis extends BinaryJedis implements JedisCommands, MultiKeyCommands,
AdvancedJedisCommands, ScriptingCommands, BasicCommands, ClusterCommands, SentinelCommands {
........
}
Jedis继承了父类BinaryJedis,那么再来看看BinaryJedis源码:
public class BinaryJedis implements BasicCommands, BinaryJedisCommands, MultiKeyBinaryCommands,
AdvancedBinaryJedisCommands, BinaryScriptingCommands, Closeable {
protected Client client = null;
protected Transaction transaction = null;
protected Pipeline pipeline = null;
......
}
查看BinaryJedis源码,不难发现,所有与redis操作都与Client类有关。我们就再来看看Client这个类吧。
public class Client extends BinaryClient implements Commands {
public Client() {
super();
}
public Client(final String host) {
super(host);
}
.......
}
继续查看BinaryClient类
public class BinaryClient extends Connection {
public enum LIST_POSITION {
BEFORE, AFTER;
public final byte[] raw;
private LIST_POSITION() {
raw = SafeEncoder.encode(name());
}
}
private boolean isInMulti;
private String password;
private long db;
private boolean isInWatch;
public BinaryClient() {
super();
}
public BinaryClient(final String host) {
super(host);
}
..........
}
还有父类,继续查看父类Connection
public class Connection implements Closeable {
private static final byte[][] EMPTY_ARGS = new byte[0][];
private String host = Protocol.DEFAULT_HOST;
private int port = Protocol.DEFAULT_PORT;
private Socket socket;
private RedisOutputStream outputStream;
private RedisInputStream inputStream;
private int pipelinedCommands = 0;
private int connectionTimeout = Protocol.DEFAULT_TIMEOUT;
private int soTimeout = Protocol.DEFAULT_TIMEOUT;
private boolean broken = false;
private boolean ssl;
private SSLSocketFactory sslSocketFactory;
private SSLParameters sslParameters;
private HostnameVerifier hostnameVerifier;
public Connection() {
}
public Connection(final String host) {
this.host = host;
}
public Connection(final String host, final int port) {
this.host = host;
this.port = port;
}
public Connection(final String host, final int port, final boolean ssl) {
this.host = host;
this.port = port;
this.ssl = ssl;
}
.........
}
吼吼,看到这里就不难发现,jedis作为redis的客户端链接服务器是通过socket来完成的。
而Redis采用的是基于内存的采用的是单进程单线程模型的KV数据库。所以作为多线程的客户端,jedis使用后要主动做归还动作。否则。。。你明白的!占用socket资源咯