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