在 Java 中使用Redis连接池需要两个 jar 包 commons-pool2-2.4.2.jar
跟 jedis-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连接
}
}
}