Redis6
9.3.3)并发的秒杀案例实现
上一篇《Redis(10) -- 不考虑并发的秒杀案例实现》因没有考虑并发,而存在的连接超时问题和超卖问题解决方案如下:
9.3.3.1)连接超时,通过连接池解决
连接池:
-
节省每次连接redis服务带来的消耗,把连接好的实例反复利用;
-
通过参数管理连接的行为
连接池参数:
-
MaxTotal:控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;如果赋值为-1,则表示不限制;如果pool已经分配了MaxTotal个jedis实例,则此时pool的状态为exhausted;
-
maxIdle:控制一个pool最多有多少个状态为idle(空闲)的jedis实例;
-
MaxWaitMillis:表示当borrow一个jedis实例时,最大的等待毫秒数,如果超过等待时间,则直接抛JedisConnectionException;
-
testOnBorrow:获得一个jedis实例的时候是否检查连接可用性(ping());如果为true,则得到的jedis实例均是可用的;
Redis连接池配置类:JedisPoolUtil.java
public class JedisPoolUtil {
private static volatile JedisPool jedisPool = null;
private JedisPoolUtil() {
}
// 连接池资源连接方法
public static JedisPool getJedisPoolInstance() {
if (null == jedisPool) {
synchronized (JedisPoolUtil.class) {
if (null == jedisPool) {
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(200);
poolConfig.setMaxIdle(32);
poolConfig.setMaxWaitMillis(100 * 1000);
poolConfig.setBlockWhenExhausted(true);
poolConfig.setTestOnBorrow(true); // ping PONG
jedisPool = new JedisPool(poolConfig, "127.0.0.1", 11079, 60000);
}
}
}
return jedisPool;
}
// 连接池资源释放方法
public static void release(JedisPool jedisPool, Jedis jedis) {
if (null != jedis) {