jedis是redis官方首选的java客户端,本篇主要记录redis简单功能demo
一、建立连接
/**
* 简单的建立连接
*/
private void simpleDemo(){
Jedis jedis = new Jedis("localhost");
String pingResult = jedis.ping();
System.out.println("pingResult = 【" + pingResult + "】");
}
结果 pingResult = 【PONG】说明建立连接成功。
然而,jedis实例不是线程安全的,所以为了避免一些线程安全问题,jedis提供了线程池jedisPool。
/**
* 通过jedisPool连接池建立连接
*/
private void jedisPoolDemo(){
JedisPool jedisPool = new JedisPool(new JedisPoolConfig(),"localhost" );
Jedis jedis = jedisPool.getResource();
String pingResult = jedis.ping();
System.out.println("pingResult = 【" + pingResult + "】");
}
结果 pingResult = 【PONG】说明建立连接成功。
在上面的测试中发现了一个比较有意思的现象,如下:
private void simpleDemo(){
Jedis jedis = new Jedis("localhost");
System.out.println("isConnected = 【" + jedis.isConnected() + "】");
System.out.println(jedis.get("hello"));
System.out.println("isConnected = 【" + jedis.isConnected() + "】");
jedis.close();
System.out.println("isConnected = 【" + jedis.isConnected() + "】");
}
结果如下:
isConnected = 【false】
hello jedis
isConnected = 【true】
isConnected = 【false】
可以发现,在实例化jedis对象后,jedis的isConnected = 【false】,isConnected方法的源码如下:
public boolean isConnected() {
return socket != null && socket.isBound() && !socket.isClosed() && socket.isConnected()
&& !socket.isInputShutdown() && !socket.isOutputShutdown();
}
可以看出isConnected主要验证jedis的socket连接。而jedis实例化的时候并没有设置socket,所以第一次isConnected返回false,可是在get方法之后,再次调用isConnected方法其返回值为true,可以想象get里肯定做了些什么,看get源码:
public String get(final String key) {
checkIsInMulti();
client.sendCommand(Protocol.Command.GET, key);
return client.getBulkReply();
}
问题应该出在client.sendCommand(Protocol.Command.GET, key)这里,sendCommand源码如下:
protected Connection sendCommand(final ProtocolCommand cmd, final byte[]... args) {
try {
connect();
Protocol.sendCommand(outputStream, cmd, args);
pipelinedCommands++;
return this;
} catch (JedisConnectionException ex) {
// Any other exceptions related to connection?
broken = true;
throw ex;
}
}
果然,这里做了connect();而且没有close,所以就会有以上结果。
再看下面的代码:
/**
* 通过jedisPool连接池建立连接
*/
private void jedisPoolDemo(){
JedisPool jedisPool = new JedisPool(new JedisPoolConfig(),"localhost" );
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
System.out.println("isConnected = 【" + jedis.isConnected() + "】");
System.out.println(jedis.get("hello"));
System.out.println("isConnected = 【" + jedis.isConnected() + "】");
}finally{
//关闭jedis连接
if(jedis != null) jedis.close();
System.out.println("isConnected = 【" + jedis.isConnected() + "】");
}
jedisPool.destroy();
System.out.println("isConnected = 【" + jedis.isConnected() + "】");
//jedis = jedisPool.getResource();
System.out.println(jedis.get("hello"));
System.out.println(jedis.isConnected());;
}
运行结果如下:
isConnected = 【true】
hello jedis
isConnected = 【true】
isConnected = 【true】
isConnected = 【false】
hello jedis
true
可以看出通过jedisPool获取的jedis对象,已经做了connect;然而当其close时,却没有断开连接,是因为
public void close() {
if (dataSource != null) {
if (client.isBroken()) {
this.dataSource.returnBrokenResource(this);
} else {
this.dataSource.returnResource(this);
}
} else {
client.close();
}
}
实际上通过jedisPool获得的jedis,在close时其dataSource!=null;其实际是将资源返还给连接值,而在连接池destory时,才真正断开连接。