Redis连接池的使用与配置

在 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连接
        }
    }
}
    原文作者:tingshuo123
    原文地址: https://www.jianshu.com/p/f7cb5235a892
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞