慕课网-一站式学习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)    收藏  举报

导航