在多線程環境中使用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實例(Jedis的dataSource成員不爲空,即指向 一個JedisPool),會進行相應的歸還給JedisPool的操作,如果是單獨生成的一個Jedis實例(Jedis的dataSource成員爲空),則會直接斷開與Redis服務器的連接。

參考資料
Jedis wiki

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章