0%

Jedis

1. 加载jar包(本文中使用mavem)在pom.xml文件中加入

1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.11</version>
</dependency>

2. 使用案例

1
2
3
4
5
6
//获取连接(空参则使用默认)
Jedis jedis = new Jedis("localhost",6379);
//操作
jedis.set("username","111");
//关闭连接
jedis.close();

其他使用方法和操作Redis一样,详见 Redis使用文档

3. Jedis连接池

1
2
3
4
5
6
7
8
9
10
11
12
13
   //创建一个配置对象
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(100);
jedisPoolConfig.setMaxIdle(10);

//创建连接池对象(空参则使用默认)
JedisPool jedisPool = new JedisPool(jedisPoolConfig,"localhost",6379);
//获取连接
Jedis jedis = jedisPool.getResource();
//使用
jedis.set("username", "111");
//归还连接对象
jedis.close();

4. Jedis工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class JedisPollUtil {

private static JedisPool jedisPool;

static {
//读取配置文件
InputStream inputStream = JedisPollUtil.class.getResourceAsStream("jedis.properties");
//创建Properties对象
Properties properties = new Properties();
//关联文件
try {
properties.load(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
//获取数据,设置 JedisPoolConfig
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxIdle(Integer.parseInt(properties.getProperty("maxTotal")));
jedisPoolConfig.setMaxIdle(Integer.parseInt(properties.getProperty("maxIdle")));
/*初始化JedisPool*/
jedisPool = new JedisPool(jedisPoolConfig,properties.getProperty("host"),Integer.parseInt(properties.getProperty("port")));
}

/*获取连接方法*/
public static Jedis getJedis(){
return jedisPool.getResource();
}
}

Jedis连接池配置信息

详见Redis参数优化

1.连接池相关参数

1
2
3
4
5
6
7
8
maxTotal	资源池中的最大连接数	参见关键参数设置建议。
maxIdle 资源池允许的最大空闲连接数 参见关键参数设置建议。
minIdle 资源池确保的最少空闲连接数 参见关键参数设置建议。
blockWhenExhausted 当资源池用尽后,调用者是否要等待。只有当值为true时,下面的maxWaitMillis才会生效。 true 建议使用默认值。
maxWaitMillis 当资源池连接用尽后,调用者的最大等待时间(单位为毫秒)。 -1(表示永不超时) 不建议使用默认值。
testOnBorrow 向资源池借用连接时是否做连接有效性检测(ping)。检测到的无效连接将会被移除。 false 业务量很大时候建议设置为false,减少一次ping的开销。
testOnReturn 向资源池归还连接时是否做连接有效性检测(ping)。检测到无效连接将会被移除。 false 业务量很大时候建议设置为false,减少一次ping的开销。
jmxEnabled 是否开启JMX监控 true 建议开启,请注意应用本身也需要开启。

2.空闲资源检测相关参数

1
2
3
4
5
6
7
testWhileIdle	是否开启空闲资源检测。	false	true
timeBetweenEvictionRunsMillis 空闲资源的检测周期(单位为毫秒) -1(不检测)
建议设置,周期自行选择,也可以默认也可以使用下方JedisPoolConfig 中的配置。
minEvictableIdleTimeMillis 资源池中资源的最小空闲时间(单位为毫秒),达到此值后空闲资源将被移除。 180000(即30分钟)
可根据自身业务决定,一般默认值即可,也可以考虑使用下方JeidsPoolConfig中的配置。
numTestsPerEvictionRun 做空闲资源检测时,每次检测资源的个数。 3
可根据自身应用连接数进行微调,如果设置为 -1,就是对所有连接做空闲监测。

3. 关键参数设置建议

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
maxTotal(最大连接数)

想合理设置maxTotal(最大连接数)需要考虑的因素较多,如:

业务希望的Redis并发量;
客户端执行命令时间;
Redis资源,例如nodes (如应用ECS个数等) * maxTotal不能超过Redis的最大连接数(可在实例详情页面查看);
资源开销,例如虽然希望控制空闲连接,但又不希望因为连接池中频繁地释放和创建连接造成不必要的开销。
假设一次命令时间,即borrow|return resource加上Jedis执行命令 ( 含网络耗时)的平均耗时约为1ms,一个连接的QPS大约是1s/1ms = 1000,而业务期望的单个Redis的QPS是50000(业务总的QPS/Redis分片个数),那么理论上需要的资源池大小(即MaxTotal)是50000 / 1000 = 50。

但事实上这只是个理论值,除此之外还要预留一些资源,所以maxTotal可以比理论值大一些。这个值不是越大越好,一方面连接太多会占用客户端和服务端资源,另一方面对于Redis这种高QPS的服务器,如果出现大命令的阻塞,即使设置再大的资源池也无济于事。

maxIdle与minIdle

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

连接池的最佳性能是maxTotal=maxIdle,这样就避免了连接池伸缩带来的性能干扰。如果您的业务存在突峰访问,建议设置这两个参数的值相等;如果并发量不大或者maxIdle设置过高,则会导致不必要的连接资源浪费。

您可以根据实际总QPS和调用Redis的客户端规模整体评估每个节点所使用的连接池大小。

使用监控获取合理值

在实际环境中,比较可靠的方法是通过监控来尝试获取参数的最佳值。可以考虑通过JMX等方式实现监控,从而找到合理值。