亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

JedisPool資源池優化方法

2024-07-14 08:40:10
字體:
來源:轉載
供稿:網友

背景

合理的JedisPool資源池參數設置能為業務使用Redis保駕護航,本文將對JedisPool的使用、資源池的參數進行詳細說明,最后給出“最合理”配置。

一、使用方法

以官方的2.9.0為例子(Jedis Release),Maven依賴如下:

<dependency>  <groupId>redis.clients</groupId>  <artifactId>jedis</artifactId>  <version>2.9.0</version>  <scope>compile</scope></dependency>

Jedis使用apache commons-pool2對Jedis資源池進行管理,所以在定義JedisPool時一個很重要的參數就是資源池GenericObjectPoolConfig,使用方式如下,其中有很多資源管理和使用的參數(具體看第二節)

注意:后面會提到建議用JedisPoolConfig代替GenericObjectPoolConfig

GenericObjectPoolConfig jedisPoolConfig = new GenericObjectPoolConfig();jedisPoolConfig.setMaxTotal(..);jedisPoolConfig.setMaxIdle(..);jedisPoolConfig.setMinIdle(..);jedisPoolConfig.setMaxWaitMillis(..);

JedisPool的初始化如下:

// redisHost和redisPort是實例的IP和端口// redisPassword是實例的密碼// timeout,這里既是連接超時又是讀寫超時,從Jedis 2.8開始有區分connectionTimeout和soTimeout的構造函數JedisPool jedisPool = new JedisPool(jedisPoolConfig, redisHost, redisPort, timeout, redisPassword);Jedis jedis = null;try {  jedis = jedisPool.getResource();  //具體的命令  jedis.executeCommand()} catch (Exception e) {  logger.error(e.getMessage(), e);} finally {  if (jedis != null)     jedis.close(); //注意這里不是關閉連接,在JedisPool模式下,Jedis會被歸還給資源池。}

二、參數說明

JedisPool保證資源在一個可控范圍內,并且提供了線程安全,但是一個合理的GenericObjectPoolConfig配置能為應用使用Redis保駕護航,下面將對它的一些重要參數進行說明和建議:

在當前環境下,Jedis連接就是資源,JedisPool管理的就是Jedis連接。

1. 資源設置和使用

 

序號 參數名 含義 默認值 使用建議
1 maxTotal 資源池中最大連接數 8 設置建議見下節
2 maxIdle 資源池允許最大空閑的連接數 8 設置建議見下節
3 minIdle 資源池確保最少空閑的連接數 0 設置建議見下節
4 blockWhenExhausted 當資源池用盡后,調用者是否要等待。只有當為true時,下面的maxWaitMillis才會生效 true 建議使用默認值
5 maxWaitMillis 當資源池連接用盡后,調用者的最大等待時間(單位為毫秒) -1:表示永不超時 不建議使用默認值
6 testOnBorrow 向資源池借用連接時是否做連接有效性檢測(ping),無效連接會被移除 false 業務量很大時候建議設置為false(多一次ping的開銷)。
7 testOnReturn 向資源池歸還連接時是否做連接有效性檢測(ping),無效連接會被移除 false 業務量很大時候建議設置為false(多一次ping的開銷)。
8 jmxEnabled 是否開啟jmx監控,可用于監控 true 建議開啟,但應用本身也要開啟

 

2.空閑資源監測

空閑Jedis對象檢測,下面四個參數組合來完成,testWhileIdle是該功能的開關。

 

序號 參數名 含義 默認值 使用建議
1 testWhileIdle 是否開啟空閑資源監測 false true
2 timeBetweenEvictionRunsMillis 空閑資源的檢測周期(單位為毫秒) -1:不檢測 建議設置,周期自行選擇,也可以默認也可以使用下面JedisPoolConfig中的配置
3 minEvictableIdleTimeMillis 資源池中資源最小空閑時間(單位為毫秒),達到此值后空閑資源將被移除 1000 60 30 = 30分鐘 可根據自身業務決定,大部分默認值即可,也可以考慮使用下面JeidsPoolConfig中的配置
4 numTestsPerEvictionRun 做空閑資源檢測時,每次的采樣數 3 可根據自身應用連接數進行微調,如果設置為-1,就是對所有連接做空閑監測

 

為了方便使用,Jedis提供了JedisPoolConfig,它本身繼承了GenericObjectPoolConfig設置了一些空閑監測設置

public class JedisPoolConfig extends GenericObjectPoolConfig { public JedisPoolConfig() {  // defaults to make your life with connection pool easier :)  setTestWhileIdle(true);  //  setMinEvictableIdleTimeMillis(60000);  //  setTimeBetweenEvictionRunsMillis(30000);  setNumTestsPerEvictionRun(-1);  }}

所有默認值可以從org.apache.commons.pool2.impl.BaseObjectPoolConfig中看到。

三、資源池大小(maxTotal)、空閑(maxIdle minIdle)設置建議

1.maxTotal:最大連接數

實際上這個是一個很難回答的問題,考慮的因素比較多:

  1. 業務希望Redis并發量
  2. 客戶端執行命令時間
  3. Redis資源:例如 nodes(例如應用個數) * maxTotal 是不能超過redis的最大連接數。
  4. 資源開銷:例如雖然希望控制空閑連接,但是不希望因為連接池的頻繁釋放創建連接造成不必靠開銷。

以一個例子說明,假設:

  1. 一次命令時間(borrow|return resource + Jedis執行命令(含網絡) )的平均耗時約為1ms,一個連接的QPS大約是1000
  2. 業務期望的QPS是50000

那么理論上需要的資源池大小是50000 / 1000 = 50個。但事實上這是個理論值,還要考慮到要比理論值預留一些資源,通常來講maxTotal可以比理論值大一些。

但這個值不是越大越好,一方面連接太多占用客戶端和服務端資源,另一方面對于Redis這種高QPS的服務器,一個大命令的阻塞即使設置再大資源池仍然會無濟于事。

2. maxIdle minIdle

maxIdle實際上才是業務需要的最大連接數,maxTotal是為了給出余量,所以maxIdle不要設置過小,否則會有new Jedis(新連接)開銷,而minIdle是為了控制空閑資源監測。

連接池的最佳性能是maxTotal = maxIdle ,這樣就避免連接池伸縮帶來的性能干擾。但是如果并發量不大或者maxTotal設置過高,會導致不必要的連接資源浪費。

可以根據實際總OPS和調用redis客戶端的規模整體評估每個節點所使用的連接池。

3.監控

實際上最靠譜的值是通過監控來得到“最佳值”的,可以考慮通過一些手段(例如jmx)實現監控,找到合理值。

四、常見問題

1.資源“不足"

redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool…Caused by: java.util.NoSuchElementException: Timeout waiting for idle objectat org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:449)

或者

redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool…Caused by: java.util.NoSuchElementException: Pool exhaustedat org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:464)

兩種情況均屬于無法從資源池獲取到資源,但第一種是超時,第二種是因為blockWhenExhausted為false根本就不等。

遇到此類異常,不要盲目的認為資源池不夠大,第三節已經進行了分析。具體原因可以排查:網絡、資源池參數設置、資源池監控(如果對jmx監控)、代碼(例如沒執行jedis.close())、慢查詢、DNS等問題。

具體可以參考該文章:https://www.atatech.org/articles/77799

2. 預熱JedisPool

由于一些原因(例如超時時間設置較小原因),有的項目在啟動成功后會出現超時。JedisPool定義最大資源數、最小空閑資源數時,不會真的把Jedis連接放到池子里,第一次使用時,池子沒有資源使用,會new Jedis,使用后放到池子里,可能會有一定的時間開銷,所以也可以考慮在JedisPool定義后,為JedisPool提前進行預熱,例如以最小空閑數量為預熱數量

List<Jedis> minIdleJedisList = new ArrayList<Jedis>(jedisPoolConfig.getMinIdle());for (int i = 0; i < jedisPoolConfig.getMinIdle(); i++) {  Jedis jedis = null;  try {    jedis = pool.getResource();    minIdleJedisList.add(jedis);    jedis.ping();  } catch (Exception e) {    logger.error(e.getMessage(), e);  } finally {  }}for (int i = 0; i < jedisPoolConfig.getMinIdle(); i++) {  Jedis jedis = null;  try {    jedis = minIdleJedisList.get(i);    jedis.close();  } catch (Exception e) {    logger.error(e.getMessage(), e);  } finally {    }}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美xxxx14xxxxx性爽| 久久这里只有精品99| 亚洲专区中文字幕| 亚洲天堂2020| 亚洲午夜精品视频| 亚洲午夜精品久久久久久久久久久久| 久久在线观看视频| 国产一区二区丝袜| 国产一区二区在线免费| 国产91亚洲精品| 日韩有码在线播放| 日韩免费观看在线观看| 欧美福利小视频| 中文字幕日韩视频| 国产成人精品久久二区二区91| 国产精品91在线观看| 亚洲福利视频二区| 国产美女直播视频一区| 亚洲精品狠狠操| 国产精品黄色影片导航在线观看| 亚洲精品久久久久国产| 日韩专区在线播放| 午夜精品久久17c| 日韩在线视频观看正片免费网站| 日韩激情在线视频| 亚洲激情在线观看| 亚洲第一天堂无码专区| 91在线播放国产| 91视频8mav| 国产精品一区二区久久| 欧美黑人极品猛少妇色xxxxx| 久久免费观看视频| 成人久久18免费网站图片| 91亚洲精品久久久| 亚洲精品资源美女情侣酒店| 欧美日韩一区二区精品| 国内免费久久久久久久久久久| 69久久夜色精品国产7777| 亚洲激情自拍图| 精品国产电影一区| 欧美另类在线播放| 奇米成人av国产一区二区三区| 一本一道久久a久久精品逆3p| 亚洲欧美日韩在线高清直播| 欧美亚洲成人网| 久久亚洲精品一区二区| 成人黄色av免费在线观看| 国产精品福利网站| 91香蕉国产在线观看| 亚洲日本中文字幕免费在线不卡| 亚洲欧美国产日韩天堂区| 国产91精品久| 国产精品v片在线观看不卡| 波霸ol色综合久久| 久久青草精品视频免费观看| 久久久亚洲国产| 国产91精品视频在线观看| 精品久久在线播放| 亚洲国产精品va在线观看黑人| 成人久久久久爱| 热99精品里视频精品| 456亚洲影院| 日韩精品www| 亚洲精品网站在线播放gif| 午夜精品一区二区三区在线| 中文字幕亚洲情99在线| 久久久久久av| 国产午夜精品久久久| 国内外成人免费激情在线视频网站| 国产精品一二区| 91久久久在线| 成人欧美一区二区三区在线| 国产精品成人免费电影| 2020国产精品视频| 日韩亚洲欧美成人| 亚洲欧美福利视频| 欧美精品在线观看| 久久久久久久香蕉网| 91影院在线免费观看视频| 国产一区二区在线播放| 国产精品视频永久免费播放| 亚洲图片制服诱惑| 欧美一乱一性一交一视频| 亚洲欧美日韩中文在线制服| 欧美精品福利在线| 亚洲成人1234| 激情成人在线视频| 日韩精品中文字幕在线观看| 国产欧美最新羞羞视频在线观看| 欧美亚洲第一页| 精品国产一区二区在线| 日韩在线免费视频观看| 精品久久久香蕉免费精品视频| 欧美成人激情在线| 成人黄色午夜影院| 精品国内亚洲在观看18黄| 国内精品伊人久久| 亚洲日本欧美日韩高观看| 国产成人精品日本亚洲专区61| 亚洲深夜福利在线| 日韩在线视频播放| 国产精品影片在线观看| 欧美极品少妇xxxxⅹ免费视频| 亚洲娇小xxxx欧美娇小| 亚洲色图13p| 国产精品专区第二| 日本电影亚洲天堂| 中文在线资源观看视频网站免费不卡| 国产精品日日摸夜夜添夜夜av| 日本欧美国产在线| 成人午夜两性视频| 丰满岳妇乱一区二区三区| 欧美极品美女电影一区| 日韩美女视频免费在线观看| 亚洲第一区中文字幕| 日韩亚洲国产中文字幕| 91a在线视频| 亚洲自拍偷拍视频| 久久精品国产清自在天天线| 久久久久久久久久av| 中文字幕亚洲一区二区三区五十路| 在线观看视频亚洲| 精品人伦一区二区三区蜜桃免费| 九九精品视频在线| 欧美三级欧美成人高清www| 国产日韩精品在线播放| 久久久久久成人| 精品国产乱码久久久久久婷婷| 亚洲人线精品午夜| 亚洲另类欧美自拍| 成人国产精品久久久| 精品久久香蕉国产线看观看gif| 日韩在线观看免费av| 久久久伊人欧美| 欧美xxxx14xxxxx性爽| 国产欧美日韩中文字幕在线| 国产午夜精品全部视频在线播放| 国产在线观看不卡| 98精品国产高清在线xxxx天堂| 国产精品福利无圣光在线一区| 亚洲精品成人网| 欧美日韩国产精品| 欧美大片va欧美在线播放| 亚洲在线一区二区| 日韩av快播网址| 中文字幕亚洲天堂| 日本在线观看天堂男亚洲| 午夜精品国产精品大乳美女| 亚洲性xxxx| 国产区亚洲区欧美区| 热99在线视频| 国产成人综合久久| 欧美黄色免费网站| 亚洲成人久久一区| 按摩亚洲人久久| 亚洲精品有码在线| 91精品综合久久久久久五月天| 欧美专区在线播放| 一个人看的www欧美| 91精品国产色综合久久不卡98口| 日韩av在线看| 久久久国产成人精品| 中文字幕成人精品久久不卡| 2019国产精品自在线拍国产不卡|