GitHub : https://github.com/asd821300801/Redis-Java-Client-Jedis
继续之前的文章:Redis Java Client Jedis
- 我们这一章来学一下Jedis的连接池技术
Jedis连接池技术
- 引入连接池所需jar包
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.4.2</version>
</dependency>
创建测试类
- JedisConnectionPoolTest.java
import org.junit.BeforeClass;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
* Jedis连接池的使用
* @author LingDu
*/
public class JedisConnectionPoolTest {
//定义连接池对象
private static JedisPool jedisPool = null;
// Redis服务器IP
private static String ADDR = "192.168.20.33";
// Redis的端口号
private static int PORT = 6379;
// 访问密码
private static String AUTH = "123456";
/**
* 初始化Redis连接池
*/
@BeforeClass
public static void init(){
try {
//创建连接池配置实例
JedisPoolConfig config = new JedisPoolConfig();
// 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true
config.setBlockWhenExhausted(true);
// 设置的逐出策略类名, 默认DefaultEvictionPolicy(当连接超过最大空闲时间,或连接数超过最大空闲连接数)
config.setEvictionPolicyClassName("org.apache.commons.pool2.impl.DefaultEvictionPolicy");
// 是否启用pool的jmx管理功能, 默认true
config.setJmxEnabled(true);
// 最大空闲连接数, 默认8个 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。
config.setMaxIdle(8);
// 最大连接数, 默认8个
config.setMaxTotal(200);
// 表示当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException;
config.setMaxWaitMillis(1000 * 100);
// 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
config.setTestOnBorrow(true);
//实例化连接池对象
jedisPool = new JedisPool(config, ADDR, PORT, 3000, AUTH);
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void testGetJedisObject() {
// 从池中获取一个Jedis对象
Jedis jedis = jedisPool.getResource();
jedis.set("username", "admin");
System.out.println(jedis.get("username"));
// 释放jedis资源
jedis.close();
}
}
代码优化
使用redis配置文件的方式读取连接配置
- 在resources目录下创建
redis.properties
,配置信息如下:
#最大连接数, 默认10个
redis.pool.maxTotal=10
#最小空闲连接数,默认2个
redis.pool.minIdle=2
#最大空闲连接数,默认10个
redis.pool.maxIdle=10
#最大的等待时间
redis.pool.maxWait=1000
#如果为true,表示有一个idle object evitor线程对idle object进行扫描,如果validate失败,此object会被从pool中drop掉;
#这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义;
redis.pool.testWhileIdle=true
#获得一个jedis实例的时候是否检查连接可用性(ping());如果为true,则得到的jedis实例均是可用的;
redis.pool.testOnBorrow=true
#return 一个jedis实例给pool时,是否检查连接可用性(ping());
redis.pool.testOnReturn=true
#host
redis.ip=127.0.0.1
#port
redis.port=6379
#auth
redis.auth=123456
创建测试类
- JedisConnectionPoolConfigTest.java
import java.io.IOException;
import java.util.Properties;
import org.junit.BeforeClass;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
* Jedis连接池的使用
* @author LingDu
*/
public class JedisConnectionPoolConfigTest {
//定义连接池对象
private static JedisPool jedisPool = null;
//定义用于读取配置文件的Properties对象
private static Properties pro;
/**
* 读取配置redis.properties文件
*/
static{
pro = new Properties();
try {
//加载配置文件
pro.load(JedisConnectionPoolConfigTest.class.getClassLoader().getResourceAsStream("redis.properties"));
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 初始化Jedis连接池
*/
@BeforeClass
public static void initJedisPoolConfig(){
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(Integer.valueOf(pro.getProperty("redis.pool.maxTotal")));
config.setMinIdle(Integer.valueOf(pro.getProperty("redis.pool.minIdle")));
config.setMaxIdle(Integer.valueOf(pro.getProperty("redis.pool.maxIdle")));
config.setMaxWaitMillis(Long.valueOf(pro.getProperty("redis.pool.maxWait")));
config.setTestWhileIdle(Boolean.valueOf(pro.getProperty("redis.pool.testWhileIdle")));
config.setTestOnBorrow(Boolean.valueOf(pro.getProperty("redis.pool.testOnBorrow")));
config.setTestOnReturn(Boolean.valueOf(pro.getProperty("redis.pool.testOnReturn")));
jedisPool = new JedisPool(config, pro.getProperty("redis.ip"),
Integer.valueOf(pro.getProperty("redis.port")),
3000,
pro.getProperty("redis.auth"));
}
@Test
public void testGetJedisObject() {
// 从池中获取一个Jedis对象
Jedis jedis = jedisPool.getResource();
jedis.set("username", "admin");
System.out.println(jedis.get("username"));
// 释放jedis资源
jedis.close();
}
}