redis的java客户端jedis(一)建立链接

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时,才真正断开连接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值