Redis客戶端——Jedis的使用

本文介紹基於Java語言的Redis客戶端——Jedis的使用,包括Jedis簡介、獲取Jedis、Jedis直連、Jedis鏈接池以及兩者的對比的選擇。git

Jedis簡介

Jedis 是 Redis 官方首選的基於Java語言的客戶端開發包。Jedis功能強大,提供了完整Redis命令,與 Redis 2.8.x, 3.x.x及以上版本徹底兼容。並且使用簡單方便,絕對是Java語言的首選客戶端。github

獲取Jedis

獲取Jedis能夠在 http://github.com/xetorthio/jedis/releases下載最新的版本;或者引入Maven依賴:redis

     <dependency>
         <groupId>redis.clients</groupId>
         <artifactId>jedis</artifactId>
         <version>3.0.1</version>
         <type>jar</type>
         <scope>compile</scope>
     </dependency>

Jedis直連

Jedis直連須要生成Jedis對象,這個對象負責和指定Redis節點進行通訊。
Jedis jedis = new Jedis("127.0.0.1",6379);

而後就能夠進行基本操做:數據庫

  • string
jedis.set("hello","world");
jedis.get("hello");
jedis.incr("counter");
  • hash
jedis.hset("myhash","f1","v1");
jedis.hset("myhash","f2","v2");
jedis.hgetAll("myhash");
  • list
jedis.rpush("mylist","1");
jedis.rpush("mylist","2");
jedis.rpush("mylist","3");
jedis.lrange("mylist",0,-1);
  • set
jedis.sadd("myset","a");
jedis.sadd("myset","b");
jedis.sadd("myset","a");
jedis.smember("myset");
  • zset
jedis.zadd("myzset",99,"alan");
jedis.zadd("myzset",88,"paul");
jedis.zadd("myzset",77,"077");
jedis.zrangeWithScores("myzset",0,-1);

Jedis鏈接池

什麼是鏈接池?舉個類比,線程池是把線程放到便於統一管理的容器裏面,那麼鏈接池就是把鏈接放到一個容器裏面,方便鏈接的管理和使用,達到節省系統資源開銷和時間的效果。安全

若是沒有鏈接池,在實際應用開發中,每一次Jedis請求都必須經歷生成Jedis對象、Jedis執行命令、Jedis返回執行結果和關閉Jedis鏈接等步驟,而新建Jedis對象,而後新建鏈接並打開數據庫是一件既消耗資源又費時的工做,若是頻繁發生這種數據庫操做,系統的性能必然會急劇降低,甚至會致使系統崩潰。若是運用池化技術,將鏈接做爲對象存儲在一個容器中(鏈接池),一旦鏈接池創建後,這些鏈接是共享的,極大地節省系統資源和時間,這就是Jedis鏈接池。若是以前已經瞭解過線程池,我想這兒看着會至關輕鬆寫意。性能

Jedis鏈接池使用主要有如下幾個步驟:建立鏈接池池、向鏈接池借Jedis對象、Jedis執行命令、返回執行結果、歸還Jedis對象給鏈接池。具體代碼以下:spa

建立Jedis鏈接池並初始化:.net

GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
JedisPool jedisPool = new JedisPool(poolConfig,"127.0.0.1",6739);

能夠看到,JedisPool大部分配置都在GenericObjectPoolConfig中完成的,GenericObjectPoolConfig參數說明以下表:線程

參數
參數說明
maxTotal
最大鏈接數,默認8個。
maxIdle
最大空閒鏈接數, 默認8個。
minIdle
最小空閒鏈接數,默認0個。
maxWaitMillis
當borrow(引入)一個jedis實例時,最大的等待時間,若是超過等待時間,則直接拋出JedisConnectionException。
testOnBorrow
在borrow一個jedis實例時,是否提早檢查鏈接可用性(ping())操做;若是爲true,則獲得的jedis實例均是可用的。默認爲false。
blockWhenExhausted
鏈接耗盡時是否阻塞, false報異常,ture阻塞直到超時, 默認true。
testOnReturn
在return一個jedis實例時,是否檢查鏈接可用性(ping()),默認爲false。
testWhileIdle
若是爲true,表示有一個idle object evitor線程對idle object進行掃描,若是validate失敗,此object會被從pool中drop掉。
這一項只有在timeBetweenEvictionRunsMillis大於0時纔有意義。
minEvictableIdleTimeMillis
表示一個對象至少停留在idle狀態的最短期,而後才能被idle object evitor掃描並驅逐。這一項只有在timeBetweenEvictionRunsMillis大於0時纔有意義。
JedisPoolConfig中默認設置爲60000。
timeBetweenEvictionRunsMillis
 
表示idle object evitor兩次掃描之間要sleep的毫秒數,默認設置爲30000。

建立和初始化Jedis鏈接池之後,能夠從Jedis鏈接池中獲取Jedis對象,進而進行操做:code

Jedis jedis = null;
try{
    //1.從鏈接池獲取jedis對象
    jedis = jedisPool.getResource();
    //2.執行操做
    jedis.set("hello","world");
}catch(Exception e){
    e.printStackTrace();
}finally{
    if(jedis != null){
        //歸還鏈接池
        jedis.close();
    }
}

如何選擇

Jedis直連和使用Jedis鏈接池各有所長,能夠根據生產環境的須要因地制宜。

若是是少許的鏈接,而且每次鏈接時間較長,適合使用Jedis直連的方式。

若是是較爲頻繁的鏈接則使用Jedis鏈接池。

  優勢 缺點
直連
  • 簡單方便
  • 用於少許長期鏈接的場景
  • 每次新建/關閉TCP開銷較大
  • 資源沒法控制,存在鏈接泄漏的可能
  • Jedis對象線程不安全
鏈接池
  • Jedis預先生成,下降開銷使用
  • 鏈接池的形式保護和控制資源的使用
  • 相對於直連,使用相對麻煩,尤爲在資源的管理上須要不少參數來保證,一旦規劃不合理也會出現問題
相關文章
相關標籤/搜索