Jedis連接池的使用方法

??Jedis有直連方式领猾,所謂直連指的是Jedis每次都會(huì)新建TCP連接钉嘹,使用后在斷開連接,對于平凡訪問Redis的場景顯然不是高效的使用方式娃属,如圖:


Jedis直連redis

??因此生產(chǎn)環(huán)境一般使用連接池的方式對Jedis連接池進(jìn)行管理爆存,如圖:


Jedis連接池使用方式

??Jedis對象預(yù)先放在池子中(JedisPool)蛉顽,每次要連接Redis,只需要在池子中借先较,用完了在歸還給池子携冤。

??客戶端連接Redis使用的是TCP協(xié)議,直連的方式每次需要建立TCP連接闲勺,而連接池的方式是可以預(yù)先初始化好Jedis連接曾棕,所以每次只需要從Jedis連接池借用即可,而借用和歸還操作是在本地進(jìn)行的菜循,只有少量的并發(fā)同步開銷翘地,遠(yuǎn)遠(yuǎn)小于新建TCP連接的開銷。另外直連的方式無法限制Jedis對象的個(gè)數(shù)癌幕,在極端情況下可能會(huì)造成連接泄漏子眶,而連接池的形式可以有效的保護(hù)和控制資源的使用。但是直連的方式也并不是一無是處序芦,下表給出兩種方式各自的優(yōu)劣勢:

  • 直連 ?優(yōu)點(diǎn):簡單方便,適用于少量長期連接的場景粤咪,缺點(diǎn):1>存在每次新建/關(guān)閉TCP連接開銷谚中。2>資源無法控制,極端情況會(huì)出現(xiàn)連接泄漏寥枝。3>Jedis對象線程不安全宪塔。
  • 連接池?優(yōu)點(diǎn):1>無需每次連接都生成Jedis對象,降低開銷囊拜。2>使用連接池的形式保護(hù)和控制資源的使用某筐。缺點(diǎn):相對于直連,使用相對麻煩冠跷,尤其在資源的管理上需要很多參數(shù)來保證南誊,一旦不合理也會(huì)出現(xiàn)問題。

??Jedis提供了JedisPool這個(gè)類作為對Jedis的連接池蜜托,同時(shí)使用了Apache的通用對象池工具common-pool作為資源的管理工具抄囚,下面是使用JedisPool操作Redis的代碼示例:
1)Jedis連接池(通常JedisPool是單例的):
//common-pool連接池配置,這里使用默認(rèn)配置橄务,后面小節(jié)會(huì)介紹具體配置說明
GenericObjectPoolConfig poolConfig=new GenericObjectPoolConfig();
//初始化Jedis連接池
JedisPool jedisPool=new JedisPool(poolConfig,"127.0.0.1",6379);

  1. 獲取Jedis對象不再是直接生成一個(gè)Jedis對象進(jìn)行直連幔托,而是從連接池直接獲取,代碼如下:
Jedis jedis =null;
try {
  //1.從連接池獲取jedis對象
  jedis=jedisPool.getResource();
  //2.執(zhí)行操作
   jedis.get("hello");
} catch (Exception e) {
  logger.error(e.getMessage(),e);
}finally{
  if(jedis!=null){
    //如果使用JedisPool,close操作不是關(guān)閉連接,代表歸還連接池
    jedis.close();
  }
}

??這里可以看到finally中依然是jedis.close()操作重挑,為什么會(huì)把連接關(guān)閉呢嗓化,這不和連接池的原則違背嗎?但實(shí)際上Jedis的close()實(shí)現(xiàn)方式如下:

public void close(){
  //使用Jedis連接池
  if(dataSource!=null){
    if(client.isBroken()){
      this.dataSource.returnBrokenResource(this);
    }else{
      this.dataSource.returnResource(this);
    }
 //直連
  }else{
    client.close();
  }
}

參數(shù)說明:

  • dataSource!=null代表使用的是連接池谬哀,所以jedis.close()代表歸還連接給連接池刺覆,而且Jedis會(huì)判斷當(dāng)前連接是否已經(jīng)斷開。
  • dataSource=null代表直連玻粪,jedis.close()代表關(guān)閉連接隅津。
    ??前面GenericObjectPoolConfig使用的是默認(rèn)配置,實(shí)際它提供有很多參數(shù)劲室,例如池子中最大連接數(shù)伦仍,最大空閑連接數(shù),最小空閑連接數(shù)很洋,連接活性檢測充蓝,等等,例如下面代碼:
GenericObjectPoolConfig poolConfig=new GenericObjectPoolConfig();
//設(shè)置最大連接數(shù)為默認(rèn)值的5倍
poolConfig.setMaxTotal(GenericObjectPoolConfig.DEFAULT_MAX_TOTAL*5);
//設(shè)置最大空閑連接數(shù)為默認(rèn)值的3倍
poolConfig.setMaxIdle(GenericObjectPoolConfig.DEFAULT_MAX_IDLE*3);
//設(shè)置最小空閑連接數(shù)為默認(rèn)值的2倍
poolConfig.setMinIdle(GenericObjectPoolConfig. DEFAULT_MIN_IDLE*2);
//設(shè)置開啟JMX功能
poolConfig.SetJmxEnabled(true);
//設(shè)置連接池沒有連接后客戶端的最大等待時(shí)間(單位為毫秒)
poolConfig.setMaxWaitMillis(3000);

GenericObjectPoolConfig的其他屬性:

基本參數(shù)
lifo ?//GenericObjectPool 提供了后進(jìn)先出(LIFO)與先進(jìn)先出(FIFO)兩種行為模式的池喉磁。默認(rèn)為true谓苟,即當(dāng)池中有空閑可用的對象時(shí),調(diào)用borrowObject方法會(huì)返回最近(后進(jìn))的實(shí)例
fairness ?//當(dāng)從池中獲取資源或者將資源還回池中時(shí) 是否使用java.util.concurrent.locks.ReentrantLock.ReentrantLock 的公平鎖機(jī)制,默認(rèn)為false

數(shù)量控制參數(shù)
maxTotal ?//鏈接池中最大連接數(shù),默認(rèn)為8
maxIdle ?//鏈接池中最大空閑的連接數(shù),默認(rèn)也為8
minIdle ?//連接池中最少空閑的連接數(shù),默認(rèn)為0

超時(shí)參數(shù)
maxWaitMillis ?//當(dāng)連接池資源耗盡時(shí)协怒,等待時(shí)間涝焙,超出則拋異常,默認(rèn)為-1即永不超時(shí)
blockWhenExhausted ?//連接耗盡時(shí)是否阻塞, false報(bào)異常,ture阻塞直到超時(shí), 默認(rèn)true孕暇。當(dāng)這個(gè)值為true的時(shí)候仑撞,maxWaitMillis參數(shù)才能生效。為false的時(shí)候妖滔,當(dāng)連接池沒資源隧哮,則立馬拋異常。默認(rèn)為true

test參數(shù)
testOnCreate ?//默認(rèn)false座舍,create的時(shí)候檢測是有有效沮翔,如果無效則從連接池中移除,并嘗試獲取繼續(xù)獲取
testOnBorrow ?//默認(rèn)false曲秉,borrow的時(shí)候檢測是有有效采蚀,如果無效則從連接池中移除,并嘗試獲取繼續(xù)獲取
testOnReturn ?//默認(rèn)false承二,return的時(shí)候檢測是有有效搏存,如果無效則從連接池中移除,并嘗試獲取繼續(xù)獲取
testWhileIdle ?//默認(rèn)false矢洲,在evictor線程里頭璧眠,當(dāng)evictionPolicy.evict方法返回false時(shí),而且testWhileIdle為true的時(shí)候則檢測是否有效,如果無效則移除

檢測參數(shù)
timeBetweenEvictionRunsMillis ?//空閑鏈接檢測線程檢測的周期责静,毫秒數(shù)袁滥。如果為負(fù)值,表示不運(yùn)行檢測線程灾螃。默認(rèn)為-1.
numTestsPerEvictionRun ?//在每次空閑連接回收器線程(如果有)運(yùn)行時(shí)檢查的連接數(shù)量题翻,默認(rèn)為3
minEvictableIdleTimeMillis ?//連接空閑的最小時(shí)間,達(dá)到此值后空閑連接將可能會(huì)被移除腰鬼。默認(rèn)為1000L 60L 30L
softMinEvictableIdleTimeMillis ?//連接空閑的最小時(shí)間嵌赠,達(dá)到此值后空閑鏈接將會(huì)被移除,且保留minIdle個(gè)空閑連接數(shù)熄赡。默認(rèn)為-1.
evictionPolicyClassName ?//evict策略的類名姜挺,默認(rèn)為org.apache.commons.pool2.impl.DefaultEvictionPolicy

其他
jmxEnabled ?//是否開啟jmx監(jiān)控,如果應(yīng)用開啟了jmx端口并且jmxEnabled設(shè)置為true彼硫,就可以通過jconsole或者jvisualvm看到關(guān)于連接池的相關(guān)統(tǒng)計(jì)炊豪,有助于了解連接池的使用情況,并且可以針對其做監(jiān)控統(tǒng)計(jì)拧篮,默認(rèn)是true词渤。
evictionPolicyClassName ?//設(shè)置的逐出策略類名, 默認(rèn)"org.apache.commons.pool2.impl.DefaultEvictionPolicy"(當(dāng)連接超過最大空閑時(shí)間,或連接數(shù)超過最大空閑連接數(shù))

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市串绩,隨后出現(xiàn)的幾起案子缺虐,更是在濱河造成了極大的恐慌,老刑警劉巖礁凡,帶你破解...
    沈念sama閱讀 212,185評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件高氮,死亡現(xiàn)場離奇詭異,居然都是意外死亡把篓,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,445評論 3 385
  • 文/潘曉璐 我一進(jìn)店門腰涧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來韧掩,“玉大人,你說我怎么就攤上這事窖铡×迫瘢” “怎么了?”我有些...
    開封第一講書人閱讀 157,684評論 0 348
  • 文/不壞的土叔 我叫張陵费彼,是天一觀的道長滑臊。 經(jīng)常有香客問我,道長箍铲,這世上最難降的妖魔是什么雇卷? 我笑而不...
    開封第一講書人閱讀 56,564評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上关划,老公的妹妹穿的比我還像新娘小染。我一直安慰自己,他們只是感情好贮折,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,681評論 6 386
  • 文/花漫 我一把揭開白布裤翩。 她就那樣靜靜地躺著,像睡著了一般调榄。 火紅的嫁衣襯著肌膚如雪踊赠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,874評論 1 290
  • 那天每庆,我揣著相機(jī)與錄音筐带,去河邊找鬼。 笑死扣孟,一個(gè)胖子當(dāng)著我的面吹牛烫堤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凤价,決...
    沈念sama閱讀 39,025評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼鸽斟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了利诺?” 一聲冷哼從身側(cè)響起富蓄,我...
    開封第一講書人閱讀 37,761評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎慢逾,沒想到半個(gè)月后立倍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,217評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡侣滩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,545評論 2 327
  • 正文 我和宋清朗相戀三年口注,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片君珠。...
    茶點(diǎn)故事閱讀 38,694評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡寝志,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出策添,到底是詐尸還是另有隱情材部,我是刑警寧澤,帶...
    沈念sama閱讀 34,351評論 4 332
  • 正文 年R本政府宣布唯竹,位于F島的核電站乐导,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏浸颓。R本人自食惡果不足惜物臂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,988評論 3 315
  • 文/蒙蒙 一旺拉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鹦聪,春花似錦账阻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,778評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至规丽,卻和暖如春蒲牧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赌莺。 一陣腳步聲響...
    開封第一講書人閱讀 32,007評論 1 266
  • 我被黑心中介騙來泰國打工冰抢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人艘狭。 一個(gè)月前我還...
    沈念sama閱讀 46,427評論 2 360
  • 正文 我出身青樓挎扰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親巢音。 傳聞我的和親對象是個(gè)殘疾皇子遵倦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,580評論 2 349

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)官撼,斷路器梧躺,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • 我們在服務(wù)器開發(fā)的過程中,往往會(huì)有一些對象傲绣,它的創(chuàng)建和初始化需要的時(shí)間比較長掠哥,比如數(shù)據(jù)庫連接,網(wǎng)絡(luò)IO秃诵,大數(shù)據(jù)對象...
    王廣帥閱讀 5,633評論 1 4
  • 1 Redis介紹1.1 什么是NoSql為了解決高并發(fā)菠净、高可擴(kuò)展禁舷、高可用、大數(shù)據(jù)存儲(chǔ)問題而產(chǎn)生的數(shù)據(jù)庫解決方...
    克魯?shù)吕?/span>閱讀 5,274評論 0 36
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 29,340評論 8 265
  • “師叔嗤练,這么多竹架子榛了,這么多燈在讶,是要做什么用煞抬?”道士李青正在收拾簽文,聞言抬頭看向街巷當(dāng)中构哺。每隔二三丈置一燈架革答,從...
    遠(yuǎn)航員阿花閱讀 543評論 0 0