客户端连接池参数配置
合理的连接池参数设置能够有效地提升客户端使用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的服务性能,降低资源开销。下将对一些重要参数进行说明,并提供设置建议。
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 |