在多線程環境中使用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實例向Redisserver發送相關的指令操作,最后調用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成員為空),則會直接斷開與Redisserver的連接。

參考資料
Jedis wiki


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM