更新时间:2024-03-25 GMT+08:00
分享

客户端连接池参数配置

合理的连接池参数设置能够有效地提升客户端使用Redis性能,不合理的配置(如连接数配置过小)可能引起应用程序无法获取连接,影响生产业务。本文以Redis客户端Jedis的连接池JedisPool为例,介绍JedisPool的使用和参数进行说明,为业务开发人员提供最佳配置的参考。

使用方法

以Jedis 4.3.1版本为例,下面是Maven依赖配置:

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

Jedis使用Apache Commons-pool2对连接池进行管理,在定义JedisPool时需注意其关键参数GenericObjectPoolConfig(连接池)。该参数的使用示例如下:

GenericObjectPoolConfig<Jedis> config =  new GenericObjectPoolConfig<>();
config.setMaxTotal(100);
config.setMaxIdle(50);
config.setMinIdle(5);
config.setTestWhileIdle(true);
....

Jedis的初始化方法如下:

JedisPool pool = new JedisPool(config, host, port, timeout, password);//创建连接池
try (Jedis jedis = pool.getResource()) { //获取连接,执行完自动释放连接
    //利用Jedis客户端执行命令
} catch (Exception e) {
    e.printStackTrace();
}
pool.close();//关闭连接池

参数说明

Jedis连接就是连接池中JedisPool管理的资源,JedisPool保证资源在一个可控范围内,并且保障线程安全。使用合理的GenericObjectPoolConfig配置能够提升Redis的服务性能,降低资源开销。下将对一些重要参数进行说明,并提供设置建议。

表1 Jedis常用参数配置说明

Jedis参数

参数说明

默认值

建议值

maxTotal

当前资源池可并发的最大连接数,单位:个。

Redis连接数要根据具体的业务量进行设置,连接数太大浪费资源,过小无法获取连接,影响业务。

8

客户端节点数*maxTotal不能超过Redis的最大连接数。

假设一个连接的QPS大约是1s/1ms = 1000,而业务期望的单个Redis的QPS是50000,那么理论上需要的资源池大小(即MaxTotal)是50000 / 1000 = 50。

maxIdle

资源池中最大的空闲连接数,单位:个。

达到后资源池会开始回收空闲连接,直到空闲连接数达到minIdle个数。主要避免空连接占用,资源浪费。

8

maxIdle实际上才是业务需要的最大连接数,maxTotal 是为了给出余量,所以maxIdle不要设置得过小,否则会有new Jedis(新连接)开销。

minIdle

资源池中保持最小的空闲可用连接数,单位:个

这部分连接数不会被回收,可防止流量增量时,连接创建不及时。

0

10~20

maxWaitMillis

资源池连接用尽后,调用者的最大等待时间,单位:毫秒。

-1

建议设置一个合理的超时时间,避免出现当连接池用尽后,应用阻塞不响应的情况。

testWhileIdle

是否在空闲资源监测时通过PING命令监测连接有效性,无效连接将被销毁。

false

true

testOnBorrow

每次向资源池获取连接时是否做连接有效性检测(发送PING请求),无效连接会被释放。

false

建议使用默认值。设为true相当于在每个命令执行完前先发一个PING命令,对高并发请求应用的性能有影响。对于业务可用性要求比较高的场景,可以设为true,可以保证连接有效的。

testOnReturn

每次向连接池归还连接时是否做连接有效性检测(发送PING请求),无效连接会被释放。

false

建议使用默认值。设为true相当于在每个命令执行完后再发一个PING命令,对高并发请求应用的性能有影响。

timeout

Jedis的socket timeout值,单位:毫秒。

2000

200~1000

相关文档