第一步,设置JedisPoolConfig的初次配置
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
//设置最大实例总数
jedisPoolConfig.setMaxTotal(500);
//控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。
jedisPoolConfig.setMaxIdle(100);
jedisPoolConfig.setMinIdle(100);
//表示当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException;
jedisPoolConfig.setMaxWaitMillis(3 * 1000);
// 在borrow一个jedis实例时,是否提前进行alidate操作;如果为true,则得到的jedis实例均是可用的;
jedisPoolConfig.setTestOnBorrow(true);
// 在还会给pool时,是否提前进行validate操作
jedisPoolConfig.setTestOnReturn(true);
jedisPoolConfig.setTestWhileIdle(true);
jedisPoolConfig.setMinEvictableIdleTimeMillis(500);
jedisPoolConfig.setSoftMinEvictableIdleTimeMillis(1000);
jedisPoolConfig.setTimeBetweenEvictionRunsMillis(1000);
jedisPoolConfig.setNumTestsPerEvictionRun(100);
return new JedisPool(jedisPoolConfig, HOST, PORT, 5000, null, 0);
第二步,本地一个tomcat容器的web项目应用,新建url链接,内部业务实现:新建Jedis,调用JedisPool,运行此tomcat。
第三步,运用jmeter压测工具,200个线程访问此url。
结果是:单单压测该链接,多次试验,应用qps平均在87q/s,此时redis库实时客户端链接在13个左右,远远没有达到jedisPoolConfig配置的最大连接数MaxTotal 500个及最小空闲数MinIdle 100个。
同向对比,目前线上单个应用qps在400q/s左右,所有redis库连接池可以配在65个左右(虽然这样做不是很正确,但至少可以这样预估),介于线上业务较复杂,所以把redis库连接池最大连接数MaxTotal暂调到150。
JedisPoolConfig的合理预估配置
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
//设置最大实例总数
jedisPoolConfig.setMaxTotal(150);
//控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。
jedisPoolConfig.setMaxIdle(30);
jedisPoolConfig.setMinIdle(10);
//表示当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException;
jedisPoolConfig.setMaxWaitMillis(3 * 1000);
// 在borrow一个jedis实例时,是否提前进行alidate操作;如果为true,则得到的jedis实例均是可用的;
jedisPoolConfig.setTestOnBorrow(true);
// 在还会给pool时,是否提前进行validate操作
jedisPoolConfig.setTestOnReturn(true);
jedisPoolConfig.setTestWhileIdle(true);
jedisPoolConfig.setMinEvictableIdleTimeMillis(500);
jedisPoolConfig.setSoftMinEvictableIdleTimeMillis(1000);
jedisPoolConfig.setTimeBetweenEvictionRunsMillis(1000);
jedisPoolConfig.setNumTestsPerEvictionRun(100);
return new JedisPool(jedisPoolConfig, HOST, PORT, 5000, null, 0);
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
//设置最大实例总数
jedisPoolConfig.setMaxTotal(500);
//控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。
jedisPoolConfig.setMaxIdle(100);
jedisPoolConfig.setMinIdle(100);
//表示当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException;
jedisPoolConfig.setMaxWaitMillis(3 * 1000);
// 在borrow一个jedis实例时,是否提前进行alidate操作;如果为true,则得到的jedis实例均是可用的;
jedisPoolConfig.setTestOnBorrow(true);
// 在还会给pool时,是否提前进行validate操作
jedisPoolConfig.setTestOnReturn(true);
jedisPoolConfig.setTestWhileIdle(true);
jedisPoolConfig.setMinEvictableIdleTimeMillis(500);
jedisPoolConfig.setSoftMinEvictableIdleTimeMillis(1000);
jedisPoolConfig.setTimeBetweenEvictionRunsMillis(1000);
jedisPoolConfig.setNumTestsPerEvictionRun(100);
return new JedisPool(jedisPoolConfig, HOST, PORT, 5000, null, 0);
第二步,本地一个tomcat容器的web项目应用,新建url链接,内部业务实现:新建Jedis,调用JedisPool,运行此tomcat。
第三步,运用jmeter压测工具,200个线程访问此url。
结果是:单单压测该链接,多次试验,应用qps平均在87q/s,此时redis库实时客户端链接在13个左右,远远没有达到jedisPoolConfig配置的最大连接数MaxTotal 500个及最小空闲数MinIdle 100个。
同向对比,目前线上单个应用qps在400q/s左右,所有redis库连接池可以配在65个左右(虽然这样做不是很正确,但至少可以这样预估),介于线上业务较复杂,所以把redis库连接池最大连接数MaxTotal暂调到150。
JedisPoolConfig的合理预估配置
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
//设置最大实例总数
jedisPoolConfig.setMaxTotal(150);
//控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。
jedisPoolConfig.setMaxIdle(30);
jedisPoolConfig.setMinIdle(10);
//表示当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException;
jedisPoolConfig.setMaxWaitMillis(3 * 1000);
// 在borrow一个jedis实例时,是否提前进行alidate操作;如果为true,则得到的jedis实例均是可用的;
jedisPoolConfig.setTestOnBorrow(true);
// 在还会给pool时,是否提前进行validate操作
jedisPoolConfig.setTestOnReturn(true);
jedisPoolConfig.setTestWhileIdle(true);
jedisPoolConfig.setMinEvictableIdleTimeMillis(500);
jedisPoolConfig.setSoftMinEvictableIdleTimeMillis(1000);
jedisPoolConfig.setTimeBetweenEvictionRunsMillis(1000);
jedisPoolConfig.setNumTestsPerEvictionRun(100);
return new JedisPool(jedisPoolConfig, HOST, PORT, 5000, null, 0);