聊聊jedis连接池参数配置

本文主要研究一下jedis连接池的参数配置

JedisConfig

redis/clients/jedis/JedisPoolConfig.java

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

JedisPoolConfig继承了GenericObjectPoolConfig,同时默认配置了testWhileIdle为true(默认为false),minEvictableIdleTime为60s(默认为30分钟),timeBetweenEvictionRuns为30s(默认为-1),numTestsPerEvictionRun为-1(即检测所有空闲连接,默认值为3)

GenericObjectPoolConfig

org/apache/commons/pool2/impl/GenericObjectPoolConfig.java

public class GenericObjectPoolConfig<T> extends BaseObjectPoolConfig<T> {/*** The default value for the {@code maxTotal} configuration attribute.* @see GenericObjectPool#getMaxTotal()*/public static final int DEFAULT_MAX_TOTAL = 8;/*** The default value for the {@code maxIdle} configuration attribute.* @see GenericObjectPool#getMaxIdle()*/public static final int DEFAULT_MAX_IDLE = 8;/*** The default value for the {@code minIdle} configuration attribute.* @see GenericObjectPool#getMinIdle()*/public static final int DEFAULT_MIN_IDLE = 0;private int maxTotal = DEFAULT_MAX_TOTAL;private int maxIdle = DEFAULT_MAX_IDLE;private int minIdle = DEFAULT_MIN_IDLE;
}

GenericObjectPoolConfig继承了BaseObjectPoolConfig,其maxTotal为8,maxIdle为8,minIdle为0

BaseObjectPoolConfig

org/apache/commons/pool2/impl/BaseObjectPoolConfig.java

public abstract class BaseObjectPoolConfig<T> extends BaseObject implements Cloneable {private boolean lifo = DEFAULT_LIFO;public static final boolean DEFAULT_LIFO = true;private boolean fairness = DEFAULT_FAIRNESS;public static final boolean DEFAULT_FAIRNESS = false;private Duration maxWaitDuration = DEFAULT_MAX_WAIT;public static final Duration DEFAULT_MAX_WAIT = Duration.ofMillis(-1L);private Duration minEvictableIdleDuration = DEFAULT_MIN_EVICTABLE_IDLE_TIME;public static final Duration DEFAULT_MIN_EVICTABLE_IDLE_TIME =Duration.ofMillis(1000L * 60L * 30L);private Duration evictorShutdownTimeoutDuration = DEFAULT_EVICTOR_SHUTDOWN_TIMEOUT;public static final Duration DEFAULT_EVICTOR_SHUTDOWN_TIMEOUT =Duration.ofMillis(10L * 1000L);private Duration softMinEvictableIdleDuration = DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME;public static final Duration DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME =Duration.ofMillis(-1);private int numTestsPerEvictionRun = DEFAULT_NUM_TESTS_PER_EVICTION_RUN;public static final int DEFAULT_NUM_TESTS_PER_EVICTION_RUN = 3;private EvictionPolicy<T> evictionPolicy; // Only 2.6.0 applications set thisprivate String evictionPolicyClassName = DEFAULT_EVICTION_POLICY_CLASS_NAME;public static final String DEFAULT_EVICTION_POLICY_CLASS_NAME = DefaultEvictionPolicy.class.getName();private boolean testOnCreate = DEFAULT_TEST_ON_CREATE;public static final boolean DEFAULT_TEST_ON_CREATE = false;private boolean testOnBorrow = DEFAULT_TEST_ON_BORROW;public static final boolean DEFAULT_TEST_ON_BORROW = false;private boolean testOnReturn = DEFAULT_TEST_ON_RETURN;public static final boolean DEFAULT_TEST_ON_RETURN = false;private boolean testWhileIdle = DEFAULT_TEST_WHILE_IDLE;public static final boolean DEFAULT_TEST_WHILE_IDLE = false;private Duration durationBetweenEvictionRuns = DEFAULT_TIME_BETWEEN_EVICTION_RUNS;public static final Duration DEFAULT_TIME_BETWEEN_EVICTION_RUNS = Duration.ofMillis(-1L);private boolean blockWhenExhausted = DEFAULT_BLOCK_WHEN_EXHAUSTED;public static final boolean DEFAULT_BLOCK_WHEN_EXHAUSTED = true;private boolean jmxEnabled = DEFAULT_JMX_ENABLE;public static final boolean DEFAULT_JMX_ENABLE = true;// TODO Consider changing this to a single property for 3.xprivate String jmxNamePrefix = DEFAULT_JMX_NAME_PREFIX;public static final String DEFAULT_JMX_NAME_PREFIX = "pool";private String jmxNameBase = DEFAULT_JMX_NAME_BASE;public static final String DEFAULT_JMX_NAME_BASE = null;
}

BaseObjectPoolConfig定义了lifo(默认为true)、fairness(默认为false)、maxWaitDuration(默认为-1)、minEvictableIdleDuration(默认为30分钟)、evictorShutdownTimeoutDuration(默认为10s)、softMinEvictableIdleDuration(默认为-1)、numTestsPerEvictionRun(默认为3)、evictionPolicyClassName(默认为DefaultEvictionPolicy.class.getName())、testOnCreate(默认为false)、testOnBorrow(默认为false)、testOnReturn(默认为false)、testWhileIdle(默认为false)、durationBetweenEvictionRuns(默认为-1)、blockWhenExhausted(默认为true)、jmxEnabled(默认为true)、jmxNamePrefix(默认为pool)、jmxNameBase(默认为null)

maxWaitDuration

org/apache/commons/pool2/impl/GenericObjectPool.java

			if (blockWhenExhausted) {if (p == null) {if (borrowMaxWaitDuration.isNegative()) {p = idleObjects.takeFirst();} else {p = idleObjects.pollFirst(borrowMaxWaitDuration);}}if (p == null) {throw new NoSuchElementException(appendStats("Timeout waiting for idle object, borrowMaxWaitDuration=" + borrowMaxWaitDuration));}}

borrow的时候在blockWhenExhausted为true时使用,-1的话则使用takeFirst方法,否则使用pollFirst(borrowMaxWaitDuration)方法

evict

getNumTests

org/apache/commons/pool2/impl/GenericObjectPool.java

    /*** Calculates the number of objects to test in a run of the idle object* evictor.** @return The number of objects to test for validity*/private int getNumTests() {final int numTestsPerEvictionRun = getNumTestsPerEvictionRun();if (numTestsPerEvictionRun >= 0) {return Math.min(numTestsPerEvictionRun, idleObjects.size());}return (int) (Math.ceil(idleObjects.size() /Math.abs((double) numTestsPerEvictionRun)));}

当numTestsPerEvictionRun为-1时,返回的是idleObjects.size()

EvictionConfig

org/apache/commons/pool2/impl/EvictionConfig.java

public class EvictionConfig {private static final Duration MAX_DURATION = Duration.ofMillis(Long.MAX_VALUE);private final Duration idleEvictDuration;private final Duration idleSoftEvictDuration;private final int minIdle;/*** Creates a new eviction configuration with the specified parameters.* Instances are immutable.** @param idleEvictDuration Expected to be provided by*        {@link BaseGenericObjectPool#getMinEvictableIdleDuration()}* @param idleSoftEvictDuration Expected to be provided by*        {@link BaseGenericObjectPool#getSoftMinEvictableIdleDuration()}* @param minIdle Expected to be provided by*        {@link GenericObjectPool#getMinIdle()} or*        {@link GenericKeyedObjectPool#getMinIdlePerKey()}* @since 2.10.0*/public EvictionConfig(final Duration idleEvictDuration, final Duration idleSoftEvictDuration, final int minIdle) {this.idleEvictDuration = PoolImplUtils.isPositive(idleEvictDuration) ? idleEvictDuration : MAX_DURATION;this.idleSoftEvictDuration = PoolImplUtils.isPositive(idleSoftEvictDuration) ? idleSoftEvictDuration : MAX_DURATION;this.minIdle = minIdle;}//......
}    

evict方法会构造EvictionConfig,minEvictableIdleDuration默认为30分钟;这里主要是针对负数进行了判断,负数则取的Long.MAX_VALUE;即softMinEvictableIdleDuration默认为-1,转换过来就是Long.MAX_VALUE

final EvictionConfig evictionConfig = new EvictionConfig(getMinEvictableIdleDuration(),getSoftMinEvictableIdleDuration(),getMinIdle());

DefaultEvictionPolicy

org/apache/commons/pool2/impl/DefaultEvictionPolicy.java

public class DefaultEvictionPolicy<T> implements EvictionPolicy<T> {@Overridepublic boolean evict(final EvictionConfig config, final PooledObject<T> underTest, final int idleCount) {// @formatter:offreturn (config.getIdleSoftEvictDuration().compareTo(underTest.getIdleDuration()) < 0 &&config.getMinIdle() < idleCount) ||config.getIdleEvictDuration().compareTo(underTest.getIdleDuration()) < 0;// @formatter:on}
}

DefaultEvictionPolicy的evict方法在idleCount大于minIdle且idleDuration大于idleSoftEvictDuration(默认为Long.MAX_VALUE)返回true,或者obj的idleDuration大于minEvictableIdleDuration(默认为30分钟)返回true

durationBetweenEvictionRuns

org/apache/commons/pool2/impl/BaseGenericObjectPool.java

    public final void setTimeBetweenEvictionRuns(final Duration timeBetweenEvictionRuns) {this.durationBetweenEvictionRuns = PoolImplUtils.nonNull(timeBetweenEvictionRuns, BaseObjectPoolConfig.DEFAULT_TIME_BETWEEN_EVICTION_RUNS);startEvictor(this.durationBetweenEvictionRuns);}final void startEvictor(final Duration delay) {synchronized (evictionLock) {final boolean isPositiverDelay = PoolImplUtils.isPositive(delay);if (evictor == null) { // Starting evictor for the first time or after a cancelif (isPositiverDelay) { // Starting new evictorevictor = new Evictor();EvictionTimer.schedule(evictor, delay, delay);}} else if (isPositiverDelay) { // Stop or restart of existing evictor: Restartsynchronized (EvictionTimer.class) { // Ensure no cancel can happen between cancel / schedule callsEvictionTimer.cancel(evictor, evictorShutdownTimeoutDuration, true);evictor = null;evictionIterator = null;evictor = new Evictor();EvictionTimer.schedule(evictor, delay, delay);}} else { // Stopping evictorEvictionTimer.cancel(evictor, evictorShutdownTimeoutDuration, false);}}}

setTimeBetweenEvictionRuns方法会durationBetweenEvictionRuns(默认为-1)去startEvictor;当改值为负数时则执行EvictionTimer.cancel,即不启动evictor线程

cancel

org/apache/commons/pool2/impl/EvictionTimer.java

    /*** Removes the specified eviction task from the timer.** @param evictor   Task to be cancelled.* @param timeout   If the associated executor is no longer required, how*                  long should this thread wait for the executor to*                  terminate?* @param restarting The state of the evictor.*/static synchronized void cancel(final BaseGenericObjectPool<?>.Evictor evictor, final Duration timeout,final boolean restarting) {if (evictor != null) {evictor.cancel();remove(evictor);}if (!restarting && executor != null && taskMap.isEmpty()) {executor.shutdown();try {executor.awaitTermination(timeout.toMillis(), TimeUnit.MILLISECONDS);} catch (final InterruptedException e) {// Swallow// Significant API changes would be required to propagate this}executor.setCorePoolSize(0);executor = null;}}

evictorShutdownTimeoutDuration即executor.awaitTermination的timeout参数

小结

参数类别参数值jedisConfig值commons-pool默认值解释
基本lifotruetrue后进先出
基本fairnessfalsefalse非公平机制
数量maxTotal8-最大连接数
数量maxIdle8-最大空间连接数
数量minIdle0-最少空闲连接数
阻塞获取blockWhenExhaustedtruetrue连接池耗尽时,获取连接是否阻塞等待
阻塞获取maxWaitMillis-1-1blockWhenExhausted为true时阻塞等待多久
健康检测testOnCreatefaslefasle创建连接的时候检测
健康检测testOnBorrowfalsefalse借用连接的时候检测
健康检测testOnReturnfalsefalse归还连接的时候检测
健康检测testWhileIdletruefalse在空闲连接检测时检测
evictdurationBetweenEvictionRuns30秒-1evictor线程运行间隔,-1为不运行
evictminEvictableIdleDuration60秒30分钟连接空闲的最小时间
evictsoftMinEvictableIdleDuration-1-1-1即Long.MAX_VALUE,它与idleCount>minIdle条件一起考虑
evictnumTestsPerEvictionRun-13每次空闲连接回收器线程(如果有)运行时检查的连接数量, -1表示全部
evictevictionPolicyClassNameDefaultEvictionPolicyDefaultEvictionPolicy判断是否需要evict的PolicyClass
evictevictorShutdownTimeoutDuration10s10s关闭evictor线程池的等待时间
jmxjmxEnabledtruetrue是否开启jmx
jmxjmxNamePrefixpoolpooljmx名称前缀
jmxjmxNameBasenullnullnull表示由pool自己定义jmxNameBase

JedisConfig默认帮我们配置了testWhileIdle为true(默认为false),minEvictableIdleTime为60s(默认为30分钟),timeBetweenEvictionRuns为30s(默认为-1),numTestsPerEvictionRun为-1(即检测所有空闲连接,默认值为3),利用evictor线程来检测空闲连接的健康情况

另外由聊聊jedis的return行为这篇分析可以得知在执行命令时若redis出问题,Jedis本身会标记底层connection为broken,在finally归还时会destory连接,保证连接池连接最终都会被清空重建。

另外在并发量比较大的场景,若要保证连接池的稳定数量则可以把minIdle设置成与maxTotal和maxIdle一样即可;若不想因为idle时间被频繁destory则可以设置minEvictableIdleTime为-1,evict方法始终返回false,evictor线程始终走的是testWhileIdle的逻辑;maxWaitMillis要设置一个合理值避免连接池耗尽阻塞线程,或者直接设置blockWhenExhausted为false

doc

  • GenericObjectPool参数解析
  • JedisPool资源池优化
  • 一次访问Redis延时高问题排查与总结
  • 实战总结|一次访问Redis延时高问题排查与总结(续)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/86818.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STL map,插入和查找的一些注意事项

01、前言&#xff08;废话&#xff09; C 的 std::map 容器中插入键值对主要有myMap(std::make_pair(key value)) &#xff0c;它们的区别你了解吗&#xff1f; auto it myMap,find(key) 和 auto value myMap[key] 都可以用于在 C 的 std::map 容器中查找键对应的值&#xff…

Spring Boot的新篇章:探索2.0版的创新功能

文章目录 引言1. Spring Boot 2.0的响应式编程2. 自动配置的改进3. Spring Boot 2.0的嵌入式Web服务器4. Spring Boot 2.0的Actuator端点5. Spring Boot 2.0的Spring Data改进6. Spring Boot 2.0的安全性增强7. Spring Boot 2.0的监控和追踪8. Spring Boot 2.0的测试改进结论 &…

6、SpringBoot_项目的打包与运行

七、SpringBoot项目的打包与运行 1.目前项目怎么运行的 通过浏览器访问idea 将jar部署到服务器 2.maven 打包项目 命令 mvn package使用命令后会得到如下的jar 3.程序运行 命令 java -jar 项目.jar启动如下 4.springboot打包需要插件 插件 <plugin><group…

c++源码编译过程(翻译阶段)的若干细节概要

c程序的编译主要包含两个阶段&#xff1a;源码编译(翻译阶段)和目标文件链接。 源码编译过程主要有如下这些阶段&#xff1a; 阶段1: 翻译源码文本字符 阶段2: 逻辑源码行标准化处理 阶段3: 文法处理&#xff0c;分解为不同的源码文本类型序列。例如分解为注释、预处理指…

从零学习开发一个RISC-V操作系统(二)丨GCC编译器和ELF格式

本篇文章的内容 一、GCC&#xff08;GUN Compiler Collection&#xff09;1.1 GCC的命令格式1.2 GCC的主要执行步骤1.3 GCC涉及的文件类型 二、ELF简介2.1 ELF文件格式图2.2 ELF文件处理的相关工具2.3 练习 本系列是博主参考B站课程学习开发一个RISC-V的操作系统的学习笔记&…

机器学习第十四课--神经网络

总结起来&#xff0c;对于深度学习的发展跟以下几点是离不开的: 大量的数据(大数据)计算资源(如GPU)训练方法(如预训练) 很多时候&#xff0c;我们也可以认为真正让深度学习爆发起来的是数据和算力&#xff0c;这并不是没道理的。 由于神经网络是深度学习的基础&#xff0c;学…

debug过程中,矩阵左乘右乘相关概念梳理

1. 变换点或者变换向量 1.1左乘 矩阵左乘通常是指对”目标点“进行左乘&#xff0c;即: A ′ R ∗ A AR*A A′R∗A 其中&#xff0c;A为原始3维点&#xff0c;表示一个3*1的列向量&#xff0c;R为33的旋转矩阵&#xff0c;A‘为变换后的点 B ′ T ∗ B BT*B B′T∗B 其中…

uniapp存值和取值方法

在UniApp中&#xff0c;可以使用全局变量、本地缓存和Vuex状态管理等方式来进行存值和取值。 全局变量&#xff1a;可以在App.vue文件的data中定义一个全局变量&#xff0c;在其他页面或组件中通过uni.$emit方法修改其值&#xff0c;并通过uni.$on方法监听值的变化。 // App.…

The 2023 ICPC Asia Regionals Online Contest (1) E. Magical Pair(数论 欧拉函数)

题目 T(T<10)组样例&#xff0c;每次给出一个n(2<n<1e18)&#xff0c; 询问多少对&#xff0c;满足 答案对998244353取模&#xff0c;保证n-1不是998244353倍数 思路来源 OEIS、SSerxhs、官方题解 2023 ICPC 网络赛 第一场简要题解 - 知乎 题解 官方题解还没有…

pip修改位于用户目录下的缓存目录

默认 pip 缓存目录&#xff1a; Windows: C:\Users\${用户名}\AppData\Local\pip\cache Linux: ~/.cache/pip 一、修改方式 1.命令方式 pip config set global.cache-dir "D:\kwok\data\pip-cache" 2.配置文件方式 ① Windows&#xff1a; C:\Users\${用…

SpringBoot2.7.14整合Swagger3.0的详细步骤及容易踩坑的地方

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;啥技术都喜欢捣鼓捣鼓&#xff0c;喜欢分享技术、经验、生活。 &#x1f60e;人生感悟&#xff1a;尝尽人生百味&#xff0c;方知世间冷暖。 &#x1f4d6;所属专栏&#xff1a;Sp…

docker系列:dockerfile及其用法解析

docker系列 关于dockerfile的简介 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/133201059 【介绍】&a…

Portainer -- docker轻型可视化工具

安装和使用 Portainer 非常简单。下面是一些基本步骤&#xff1a; 安装 Docker&#xff1a;Portainer 是一个基于 Docker 的官方容器管理工具&#xff0c;因此首先要确保你的系统上已经安装了 Docker。你可以根据你的操作系统选择合适的方式安装 Docker。 安装 Portainer 容器…

指针笔试题详解

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂。 目录 1.前言 2.指针题写出下列程序的结…

记一次逆向某医院挂号软件的经历

背景 最近家里娃需要挂专家号的儿保&#xff0c;奈何专家号实在过于抢手&#xff0c;身为程序员的我也没有其他的社会资源渠道可以去弄个号&#xff0c;只能发挥自己的技术力量来解决这个问题了。 出师不利 首先把应用安装到我已经 Root 过的 Pixel 3 上面&#xff0c;点击应…

【重新定义matlab强大系列十五】非线性数据拟合和线性拟合-附实现过程

&#x1f517; 运行环境&#xff1a;Matlab &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&#x1f91…

WinApp自动化测试之工具的选择

WinApp&#xff08;Windows APP&#xff09;是运行在Windows操作系统上的应用程序&#xff0c;通常会提供一个可视的界面&#xff0c;用于和用户交互。 例如运行在Windows系统上的Microsoft Office、PyCharm、Visual Studio Code、Chrome&#xff0c;都属于WinApp。常见的WinA…

MySQL高可用

目录 MySQL高可用方案 1、MHA架构&#xff08;单主&#xff09; MHA的工作原理 MHA 架构的优点 MHA 架构的缺点 2、MHA架构的部署 1&#xff09;关闭防火墙和selinux 2&#xff09;分别修改master和slave1&#xff0c;slave2的主机名 3&#xff09;修改master主库服务…

leetcode86 分割链表

题目 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 示例 输入&#xff1a;head [1,4,3,2,5,2], x 3 输出&#xff1…

windows上配置vscode C/C++代码跳转

windows上配置vscode C/C代码跳转 安装插件 C/C 官方的 C/C 插件&#xff0c;必备的插件&#xff0c;是代码跳转、自动补全、代码大纲显示等功能的基础。 Gtags C/C GNU Global GNU Global除了安装该插件之外&#xff0c;还需要在本地下载安装GNU Global工具。多看下插件…