码迷,mamicode.com
首页 > 编程语言 > 详细

在多线程环境中使用Jedis

时间:2015-07-10 15:14:13      阅读:1354      评论:0      收藏:0      [点我收藏+]

标签:jedis   redis   jedis线程安全   jedispool   jedis多线程   

Jedis是一个Java语言的Redis客户端,它为Java语言连接与操作Redis提供了简单易用的接口。Jedis不是线程安全的,故不应该在多线程环境中共用一个Jedis实例。但是,也应该避免直接创建多个Jedis实例,因为这种做法会导致创建过多的socket连接,性能不高。
要保证线程安全且获得较好的性能,可以使用JedisPool。JedisPool是一个连接池,既可以保证线程安全,又可以保证了较高的效率。
可以声明一个全局的JedisPool变量来保存JedisPool对象的引用,然后在其他地方使用。要知道,JedisPool是一个线程安全的连接池。

JedisPool pool = new JedisPool(new JedisPoolConfig(), "localhost");

使用JedisPool来获得一个Jedis实例的方法如下,

Jedis jedis = null;
try {
  jedis = pool.getResource();
  /// ... 执行相关的Redis操作
  jedis.set("foo", "bar");
  String foobar = jedis.get("foo");
  jedis.zadd("sose", 0, "car"); jedis.zadd("sose", 0, "bike"); 
  Set<String> sose = jedis.zrange("sose", 0, -1);
} finally {
  if (jedis != null) {
    jedis.close();
  }
}
/// ... 当关闭应用程序时:
pool.destroy();

通过pool.getResource()获得一个Jedis实例,然后可以利用这个Jedis实例向Redis服务器发送相关的指令操作,在最后需要调用Jedis类的close方法,将这个Jedis实例归还给JedisPool。
Jedis类的close方法如下,

public void close() {
    if (dataSource != null) {
      if (client.isBroken()) {
        this.dataSource.returnBrokenResource(this);
      } else {
        this.dataSource.returnResource(this);
      }
    } else {
      client.close();
    }
  }

可以看到,如果是从JedisPool取得的Jedis实例,会进行相应的归还给JedisPool的操作,如果是单独生成的一个Jedis实例,则会直接断开与Redis服务器的连接。

参考资料
Jedis wiki

版权声明:本文为博主原创文章,未经博主允许不得转载。

在多线程环境中使用Jedis

标签:jedis   redis   jedis线程安全   jedispool   jedis多线程   

原文地址:http://blog.csdn.net/lihao21/article/details/46830553

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!