慕课网-一站式学习Redis从入门到高可用分布式实践-第3章-Redis客户端的使用-Jedis配置优化
Jedis配置优化
#初始化Jedis,通常来讲JedisPool是单例的。GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig(); JedisPool jedisPool = new JedisPool(poolConfig, "127.0.0.1", 6379);

commons-pool配置(1)-资源数控制

commons-pool配置(2)-借换参数

适合的maxTotal
比较难确定的,举个例子:
1.命令平均执行时间 0.1ms = 0.001s
2.业务需要 50000 QPS
3.maxTotal理论值 = 0.001 * 50000 = 50个。实际值要偏大一些。
maxTotal考虑的事情
1.业务希望Redis并发量
2.客户端执行命令时间
3.Redis资源:例如 nodes(例如应用个数)* maxTotal 是不能超过 redis 的最大连接数。(config get maxclients)
4.资源开销:例如虽然希望控制空闲连接,但是不希望因为连接池的频繁释放创建连接造成不必靠开销
适合的maxIdle和minIdle
建议 maxIdle = maxTotal
1)减少创建新连接的开销
建议预热 minIdle
1)减少第一次启动后的新连接开销
常见问题


解决思路
1.慢查询阻塞:池子连接都被hang住
2.资源池参数不合理:例如QPS高、池子小。
3.连接泄露(没有close()):此类问题比较难定位,例如 client list、netstat等,最重要的是代码
4.DNS异常等
package com.carlosfu;
import redis.clients.jedis.JedisPoolConfig;
public class JedisPoolOptimizeTest {
public static void main(String[] args) {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(10);
jedisPoolConfig.setMaxWaitMillis(1000);
JedisPool jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 6379);
for (int i = 0; i < 10; i++) {
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
jedis.ping();
} catch(Exception e) {
e.printStackTrace();
}
}
jedisPool.getResource().ping();
}
}
推荐写法
Jedis jedis = null;
try {
//1.从连接池获取jedis对象
jedis = jedisPool.getResource();
//2.执行操作
jedis.set("hello", "world");
} catch(Exception e) {
logger.error(e.getMessage(), e);
} finally {
if (jedis != null)
//如果使用JedisPool, close操作不是关闭连接,代表归还连接池
jedis.close();
}
posted on 2019-12-02 11:26 herisson_pan 阅读(14) 评论(0) 收藏 举报
浙公网安备 33010602011771号