1. 程式人生 > >在多執行緒環境中使用Jedis

在多執行緒環境中使用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伺服器的連線。