Jedis是一个Java语言的Redis客户端,它为Java语言链接与操做Redis提供了简单易用的接口。git
Jedis不是线程安全的。故不该该在多线程环境中共用一个Jedis实例。但是。也应该避免直接建立多个Jedis实例,因为这样的作法会致使建立过多的socket链接,性能不高。github
要保证线程安全且得到较好的性能。可以使用JedisPool。JedisPool是一个链接池,既可以保证线程安全,又可以保证了较高的效率。安全
可以声明一个全局的JedisPool变量来保存JedisPool对象的引用,而后在其它地方使用。要知道。JedisPool是一个线程安全的链接池。markdown
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实例向Redisserver发送相关的指令操做,最后调用Jedis类的close
方法。将这个Jedis实例归还给JedisPool。socket
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实例(Jedis的dataSource成员不为空。即指向 一个JedisPool),会进行对应的归还给JedisPool的操做。假设是单独生成的一个Jedis实例(Jedis的dataSource成员为空),则会直接断开与Redisserver的链接。this
參考资料
Jedis wikispa