本文介紹基於Java語言的Redis客戶端——Jedis的使用,包括Jedis簡介、獲取Jedis、Jedis直連、Jedis鏈接池以及兩者的對比的選擇。git
Jedis 是 Redis 官方首選的基於Java語言的客戶端開發包。Jedis功能強大,提供了完整Redis命令,與 Redis 2.8.x, 3.x.x及以上版本徹底兼容。並且使用簡單方便,絕對是Java語言的首選客戶端。github
獲取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 = new Jedis("127.0.0.1",6379);
而後就能夠進行基本操做:數據庫
jedis.set("hello","world"); jedis.get("hello"); jedis.incr("counter");
jedis.hset("myhash","f1","v1"); jedis.hset("myhash","f2","v2"); jedis.hgetAll("myhash");
jedis.rpush("mylist","1"); jedis.rpush("mylist","2"); jedis.rpush("mylist","3"); jedis.lrange("mylist",0,-1);
jedis.sadd("myset","a"); jedis.sadd("myset","b"); jedis.sadd("myset","a"); jedis.smember("myset");
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對象給鏈接池。具體代碼以下: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鏈接池。
優勢 | 缺點 | |
直連 |
|
|
鏈接池 |
|
|