最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JedisPool資源池優(yōu)化方法

 更新時(shí)間:2018年03月22日 09:51:16   作者:南極山  
這篇文章主要介紹了JedisPool資源池優(yōu)化方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

背景

合理的JedisPool資源池參數(shù)設(shè)置能為業(yè)務(wù)使用Redis保駕護(hù)航,本文將對(duì)JedisPool的使用、資源池的參數(shù)進(jìn)行詳細(xì)說(shuō)明,最后給出“最合理”配置。

一、使用方法

以官方的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對(duì)Jedis資源池進(jìn)行管理,所以在定義JedisPool時(shí)一個(gè)很重要的參數(shù)就是資源池GenericObjectPoolConfig,使用方式如下,其中有很多資源管理和使用的參數(shù)(具體看第二節(jié))

注意:后面會(huì)提到建議用JedisPoolConfig代替GenericObjectPoolConfig

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

JedisPool的初始化如下:

// redisHost和redisPort是實(shí)例的IP和端口
// redisPassword是實(shí)例的密碼
// timeout,這里既是連接超時(shí)又是讀寫(xiě)超時(shí),從Jedis 2.8開(kāi)始有區(qū)分connectionTimeout和soTimeout的構(gòu)造函數(shù)

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(); //注意這里不是關(guān)閉連接,在JedisPool模式下,Jedis會(huì)被歸還給資源池。
}

二、參數(shù)說(shuō)明

JedisPool保證資源在一個(gè)可控范圍內(nèi),并且提供了線程安全,但是一個(gè)合理的GenericObjectPoolConfig配置能為應(yīng)用使用Redis保駕護(hù)航,下面將對(duì)它的一些重要參數(shù)進(jìn)行說(shuō)明和建議:

在當(dāng)前環(huán)境下,Jedis連接就是資源,JedisPool管理的就是Jedis連接。

1. 資源設(shè)置和使用

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

2.空閑資源監(jiān)測(cè)

空閑Jedis對(duì)象檢測(cè),下面四個(gè)參數(shù)組合來(lái)完成,testWhileIdle是該功能的開(kāi)關(guān)。

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

為了方便使用,Jedis提供了JedisPoolConfig,它本身繼承了GenericObjectPoolConfig設(shè)置了一些空閑監(jiān)測(cè)設(shè)置

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

所有默認(rèn)值可以從org.apache.commons.pool2.impl.BaseObjectPoolConfig中看到。

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

1.maxTotal:最大連接數(shù)

實(shí)際上這個(gè)是一個(gè)很難回答的問(wèn)題,考慮的因素比較多:

  1. 業(yè)務(wù)希望Redis并發(fā)量
  2. 客戶端執(zhí)行命令時(shí)間
  3. Redis資源:例如 nodes(例如應(yīng)用個(gè)數(shù)) * maxTotal 是不能超過(guò)redis的最大連接數(shù)。
  4. 資源開(kāi)銷(xiāo):例如雖然希望控制空閑連接,但是不希望因?yàn)檫B接池的頻繁釋放創(chuàng)建連接造成不必靠開(kāi)銷(xiāo)。

以一個(gè)例子說(shuō)明,假設(shè):

  1. 一次命令時(shí)間(borrow|return resource + Jedis執(zhí)行命令(含網(wǎng)絡(luò)) )的平均耗時(shí)約為1ms,一個(gè)連接的QPS大約是1000
  2. 業(yè)務(wù)期望的QPS是50000

那么理論上需要的資源池大小是50000 / 1000 = 50個(gè)。但事實(shí)上這是個(gè)理論值,還要考慮到要比理論值預(yù)留一些資源,通常來(lái)講maxTotal可以比理論值大一些。

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

2. maxIdle minIdle

maxIdle實(shí)際上才是業(yè)務(wù)需要的最大連接數(shù),maxTotal是為了給出余量,所以maxIdle不要設(shè)置過(guò)小,否則會(huì)有new Jedis(新連接)開(kāi)銷(xiāo),而minIdle是為了控制空閑資源監(jiān)測(cè)。

連接池的最佳性能是maxTotal = maxIdle ,這樣就避免連接池伸縮帶來(lái)的性能干擾。但是如果并發(fā)量不大或者maxTotal設(shè)置過(guò)高,會(huì)導(dǎo)致不必要的連接資源浪費(fèi)。

可以根據(jù)實(shí)際總OPS和調(diào)用redis客戶端的規(guī)模整體評(píng)估每個(gè)節(jié)點(diǎn)所使用的連接池。

3.監(jiān)控

實(shí)際上最靠譜的值是通過(guò)監(jiān)控來(lái)得到“最佳值”的,可以考慮通過(guò)一些手段(例如jmx)實(shí)現(xiàn)監(jiān)控,找到合理值。

四、常見(jiàn)問(wèn)題

1.資源“不足"

redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
…
Caused by: java.util.NoSuchElementException: Timeout waiting for idle object
at 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 exhausted
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:464)

兩種情況均屬于無(wú)法從資源池獲取到資源,但第一種是超時(shí),第二種是因?yàn)閎lockWhenExhausted為false根本就不等。

遇到此類(lèi)異常,不要盲目的認(rèn)為資源池不夠大,第三節(jié)已經(jīng)進(jìn)行了分析。具體原因可以排查:網(wǎng)絡(luò)、資源池參數(shù)設(shè)置、資源池監(jiān)控(如果對(duì)jmx監(jiān)控)、代碼(例如沒(méi)執(zhí)行jedis.close())、慢查詢、DNS等問(wèn)題。

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

2. 預(yù)熱JedisPool

由于一些原因(例如超時(shí)時(shí)間設(shè)置較小原因),有的項(xiàng)目在啟動(dòng)成功后會(huì)出現(xiàn)超時(shí)。JedisPool定義最大資源數(shù)、最小空閑資源數(shù)時(shí),不會(huì)真的把Jedis連接放到池子里,第一次使用時(shí),池子沒(méi)有資源使用,會(huì)new Jedis,使用后放到池子里,可能會(huì)有一定的時(shí)間開(kāi)銷(xiāo),所以也可以考慮在JedisPool定義后,為JedisPool提前進(jìn)行預(yù)熱,例如以最小空閑數(shù)量為預(yù)熱數(shù)量

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 {
  
  }
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java 在生活中的 10 大應(yīng)用

    Java 在生活中的 10 大應(yīng)用

    這篇文章主要給大家分享Java 在生活中的 10 大應(yīng)用,桌面圖形用戶界面、移動(dòng)應(yīng)用、人工智能、網(wǎng)絡(luò)應(yīng)用程序、大數(shù)據(jù)技術(shù)、游戲應(yīng)用、商業(yè)應(yīng)用、嵌入式系統(tǒng)、云應(yīng)用、科學(xué)應(yīng)用,下文來(lái)看具體應(yīng)用介紹,需要的朋友可以參考一下
    2021-11-11
  • 深入理解JAVA 備忘錄模式

    深入理解JAVA 備忘錄模式

    這篇文章主要介紹了JAVA 備忘錄模式的的相關(guān)資料,文中示例代碼非常細(xì)致,供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • Linux 下通過(guò) java 命令啟動(dòng) jar 包常見(jiàn)方式小結(jié)

    Linux 下通過(guò) java 命令啟動(dòng) jar 包常見(jiàn)方式小結(jié)

    這篇文章主要介紹了Linux 下通過(guò) java 命令啟動(dòng) jar 包常見(jiàn)方式小結(jié),后臺(tái)啟動(dòng)jar包命令大致有五種,每種方式結(jié)合代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2023-12-12
  • 微服務(wù)SpringBoot整合Jasypt加密工具的場(chǎng)景分析

    微服務(wù)SpringBoot整合Jasypt加密工具的場(chǎng)景分析

    Jasypt是Java加密工具包,能支持對(duì)密碼的哈希加密,對(duì)文本和二進(jìn)制數(shù)據(jù)的對(duì)稱(chēng)加解密,還能集成SpringBoot項(xiàng)目對(duì)配置文件中的密鑰進(jìn)行加密存儲(chǔ),這篇文章主要介紹了微服務(wù)SpringBoot整合Jasypt加密工具,需要的朋友可以參考下
    2022-10-10
  • MyBatis中動(dòng)態(tài)sql的實(shí)現(xiàn)方法示例

    MyBatis中動(dòng)態(tài)sql的實(shí)現(xiàn)方法示例

    這篇文章主要給大家介紹了關(guān)于MyBatis中動(dòng)態(tài)sql的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • Java 跨域問(wèn)題的處理方式

    Java 跨域問(wèn)題的處理方式

    這篇文章主要介紹了Java 跨域問(wèn)題的處理方式,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-11-11
  • 詳解使用Mybatis-plus + velocity模板生成自定義的代碼

    詳解使用Mybatis-plus + velocity模板生成自定義的代碼

    這篇文章主要介紹了詳解使用Mybatis-plus + velocity模板生成自定義的代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Java打印九九乘法表代碼詳情

    Java打印九九乘法表代碼詳情

    這篇文章主要介紹了Java打印九九乘法表,使用了雙重for循環(huán),使用do{}while()實(shí)現(xiàn)打印九九乘法表這些好玩的語(yǔ)法實(shí)現(xiàn),感興趣的小伙伴可參考下面文章內(nèi)容
    2021-09-09
  • JAVA中使用JSON進(jìn)行數(shù)據(jù)傳遞示例

    JAVA中使用JSON進(jìn)行數(shù)據(jù)傳遞示例

    本篇文章主要介紹了JAVA中使用JSON進(jìn)行數(shù)據(jù)傳遞示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • SpringBoot中yml的數(shù)據(jù)綁定示例

    SpringBoot中yml的數(shù)據(jù)綁定示例

    本文主要介紹了SpringBoot中yml的數(shù)據(jù)綁定示例,借助于YAML的簡(jiǎn)潔語(yǔ)法和結(jié)構(gòu)化特性,我們能夠輕松地管理應(yīng)用程序的配置信息,使得配置文件更加清晰易讀,感興趣的可以了解一下
    2023-11-11

最新評(píng)論

赞皇县| 荣成市| 社旗县| 塔城市| 台州市| 奇台县| 新干县| 沈阳市| 扎兰屯市| 广南县| 阳春市| 西昌市| 江北区| 巢湖市| 高碑店市| 洮南市| 靖边县| 乃东县| 临武县| 永康市| 紫阳县| 赤壁市| 秦皇岛市| 富宁县| 白城市| 天峨县| 准格尔旗| 泸西县| 乌拉特后旗| 周至县| 洮南市| 留坝县| 天峨县| 皮山县| 定南县| 崇州市| 道真| 镇江市| 甘泉县| 庐江县| 繁昌县|