美文网首页
Redis连接池的使用与配置

Redis连接池的使用与配置

作者: tingshuo123 | 来源:发表于2018-10-10 14:32 被阅读174次

    在 Java 中使用Redis连接池需要两个 jar 包 commons-pool2-2.4.2.jarjedis-2.9.0.jar

    配置连接池

    因为连接池中会有很多jedis实例,RedisPool对象会很大,所以我们需要把他写成单例模式,如果是交由Spring管理就不用了,因为Spring管理的Bean默认是单例的。

    配置连接池
    // 连接信息
    private static final String HOST = "132.232.6.208";
    private static final int PORT = 6381;
    
    JedisPoolConfig poolConfig = new JedisPoolConfig();
    // 基本配置
    poolConfig.setMaxTotal(1000);           // 最大连接数
    poolConfig.setMaxIdle(32);              // 最大空闲连接数
    poolConfig.setMaxWaitMillis(100*1000);  // 最大等待时间
    poolConfig.setTestOnBorrow(true);       // 检查连接可用性, 确保获取的redis实例可用
                        
    JedisPool jedisPool = new JedisPool(poolConfig, HOST, PORT);
    
    获取连接池连接
    Jedis jedis = jedisPool.getResource();
    
    将连接归还连接池
    jedisPool.returnResourceObject(jedis);  // 已废弃,推荐使用jedis.close()方法
    
    jedis.close()
    
    完整代码
    package com.project.uitl;
    
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisPool;
    import redis.clients.jedis.JedisPoolConfig;
    
    /**
     * Redis 连接池工具包
     * @author wqj24
     *
     */
    public class JedisPoolUtil {
        
        private static final String HOST = "132.232.6.208";
        private static final int PORT = 6381;
        
        private static volatile JedisPool jedisPool = null;
        
        private JedisPoolUtil() {}
        
        /**
         * 获取RedisPool实例(单例)
         * @return RedisPool实例
         */
        public static JedisPool getJedisPoolInstance() {
            if (jedisPool == null) {
                synchronized (JedisPoolUtil.class) {
                    if (jedisPool == null) {
                        
                        JedisPoolConfig poolConfig = new JedisPoolConfig();
                        poolConfig.setMaxTotal(1000);           // 最大连接数
                        poolConfig.setMaxIdle(32);              // 最大空闲连接数
                        poolConfig.setMaxWaitMillis(100*1000);  // 最大等待时间
                        poolConfig.setTestOnBorrow(true);       // 检查连接可用性, 确保获取的redis实例可用
                        
                        jedisPool = new JedisPool(poolConfig, HOST, PORT);
                    }
                }
            }
            
            return jedisPool;
        }
        
        /**
         * 从连接池中获取一个 Jedis 实例(连接)
         * @return Jedis 实例
         */
        public static Jedis getJedisInstance() {
            
            return getJedisPoolInstance().getResource();
        }
        
        /**
         * 将Jedis对象(连接)归还连接池
         * @param jedisPool 连接池
         * @param jedis 连接对象
         */
        public static void release(JedisPool jedisPool, Jedis jedis) {
            
            if (jedis != null) {
                jedisPool.returnResourceObject(jedis);  // 已废弃,推荐使用jedis.close()方法
            }
        }
    }
    
    测试代码
    package com.project.test;
    
    import org.junit.Test;
    
    import com.project.uitl.JedisPoolUtil;
    
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisPool;
    
    public class RedisPoolTest {
        
        JedisPool jedisPool = JedisPoolUtil.getJedisPoolInstance();
        
        // 测试单例
        @Test
        public void test01() {
            JedisPool A = JedisPoolUtil.getJedisPoolInstance();
            JedisPool B = JedisPoolUtil.getJedisPoolInstance();
    
            System.out.println(A == B);
        }
        
        @Test
        public void test02() {
            Jedis jedis = null;
            
            try {
                jedis = jedisPool.getResource();  // 获取Redus连接
                
                // 业务
                jedis.set("k1", "v111");
                System.out.println(jedis.get("k1"));
            } finally {
                jedis.close(); // 关闭redis连接
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:Redis连接池的使用与配置

          本文链接:https://www.haomeiwen.com/subject/qhmpaftx.html