JedisPool使用
1. JedisPoolConfig
JedisPool的配置参数大部分是由JedisPoolConfig的对应项来赋值的。
-
maxActive:控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted。
-
maxIdle:控制一个pool最多有多少个状态为idle(空闲)的jedis实例;
-
whenExhaustedAction:表示当pool中的jedis实例都被allocated完时,pool要采取的操作;
默认有三种:- WHEN_EXHAUSTED_FAIL --> 表示无jedis实例时,直接抛出NoSuchElementException;
- WHEN_EXHAUSTED_BLOCK --> 则表示阻塞住,或者达到maxWait时抛出JedisConnectionException;
- WHEN_EXHAUSTED_GROW --> 则表示新建一个jedis实例,也就说设置的maxActive无用;
-
maxWait:表示当borrow一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛JedisConnectionException;
-
testOnBorrow:获得一个jedis实例的时候是否检查连接可用性(ping());如果为true,则得到的jedis实例均是可用的;
-
testOnReturn:return 一个jedis实例给pool时,是否检查连接可用性(ping());
-
testWhileIdle:如果为true,表示有一个idle object evitor线程对idle object进行扫描,如果validate失败,此object会被从pool中drop掉;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义;
-
timeBetweenEvictionRunsMillis:表示idle object evitor两次扫描之间要sleep的毫秒数;
-
numTestsPerEvictionRun:表示idle object evitor每次扫描的最多的对象数;
-
minEvictableIdleTimeMillis:表示一个对象至少停留在idle状态的最短时间,然后才能被idle object evitor扫描并驱逐;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义;
-
softMinEvictableIdleTimeMillis:在minEvictableIdleTimeMillis基础上,加入了至少minIdle个对象已经在pool里面了。如果为-1,evicted不会根据idle time驱逐任何对象。如果minEvictableIdleTimeMillis>0,则此项设置无意义,且只有在timeBetweenEvictionRunsMillis大于0时才有意义;
-
lifo:borrowObject返回对象时,是采用DEFAULT_LIFO(last in first out,即类似cache的最频繁使用队列),如果为False,则表示FIFO队列;
注:
其中JedisPoolConfig对一些参数的默认设置如下:
testWhileIdle=true
minEvictableIdleTimeMills=60000
timeBetweenEvictionRunsMillis=30000
numTestsPerEvictionRun=-1
2. jar 包引入
<!-- redis连接客户端jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
3. 工具类
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/****************************************************
*
* 描 述:
*
*
* @author majker
* @version 1.0
* @see HISTORY
**************************************************/
public class RedisLocalUtil {
/**
* 服务器IP地址
*/
private static String ADDR = "127.0.0.1";
/**
* 端口
*/
private static int PORT = 6379;
/**
* 密码
*/
private static String AUTH = "123456";
/**
* 连接实例的最大连接数
*/
private static int MAX_ACTIVE = 1024;
/**
* 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。
*/
private static int MAX_IDLE = 200;
/**
* 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException
*/
private static int MAX_WAIT = 10000;
/**
* 连接超时的时间
*/
private static int TIMEOUT = 10000;
/**
* 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
*/
private static boolean TEST_ON_BORROW = true;
private static JedisPool jedisPool = null;
/**
* 数据库模式是16个数据库 0~15
*/
public static final int DEFAULT_DATABASE = 0;
/**
* 初始化Redis连接池
*/
static {
try {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(MAX_ACTIVE);
config.setMaxIdle(MAX_IDLE);
config.setMaxWaitMillis(MAX_WAIT);
config.setTestOnBorrow(TEST_ON_BORROW);
jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT, AUTH, DEFAULT_DATABASE);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取Jedis实例
*/
public synchronized static Jedis getJedis() {
try {
if (jedisPool != null) {
Jedis resource = jedisPool.getResource();
//查看服务是否运行
System.out.println("redis服务正在运行: " + resource.ping());
return resource;
} else {
return null;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/***
*
* 释放资源
*/
public static void returnResource(final Jedis jedis) {
if (jedis != null) {
jedisPool.returnResource(jedis);
}
}
}
4. 测试用例
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.*;
import java.text.SimpleDateFormat;
import java.util.*;
/****************************************************
* 描述:
* 示例
*
*
* @author majker
* @version 1.0
**************************************************/
public class RedisJavaTest {
/*todo:pom.xml
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.3</version>
</dependency>
*/
private static Jedis jedis;
static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Before
public void before(){
jedis = RedisLocalUtil.getJedis();
}
@After
public void after(){
RedisLocalUtil.returnResource(jedis);
}
//**** 以下为测试示例 **** //
/**
* 初步使用 Jedis
*/
@Test
public void useJedis() {
//连接本地的 Redis 服务
//ip 和端口设置
Jedis jedis = new Jedis("localhost",6379);
//此处为你设置的密码
jedis.auth("123456");
System.out.println("连接成功");
// 获取数据并输出
Set<String> keys = jedis.keys("*");
Iterator<String> it = keys.iterator();
System.out.println("数据库:" + jedis.getDB());
while (it.hasNext()) {
String key = it.next();
System.out.println("\t" + key);
}
}
/**
* Redis Java Keys 实例
*/
@Test
public void example3() {
System.out.println(
"/****************************************************\n" +
" * 示例3:Redis Java Keys 实例\n" +
" * @date " + sdf.format(new Date()) + "\n" +
" **************************************************/"
);
// //连接本地的 Redis 服务
// 获取数据并输出
Set<String> keys = jedis.keys("*");
Iterator<String> it = keys.iterator();
System.out.println("数据库:" + jedis.getDB());
while (it.hasNext()) {
String key = it.next();
System.out.println("\t" + key);
}
RedisLocalUtil.returnResource(jedis);
}
/**
*Redis Java List(列表) 实例
*/
@Test
public void example2() {
System.out.println(
"/****************************************************\n" +
" * 示例2:Redis Java List(列表) 实例\n" +
" * @date " + sdf.format(new Date()) + "\n" +
" **************************************************/"
);
//存储数据到列表中
jedis.lpush("site-list", "Runoob");
jedis.lpush("site-list", "Google");
jedis.lpush("site-list", "Taobao");
// 获取存储的数据并输出
List<String> list = jedis.lrange("site-list", 0 ,2);
for(int i=0; i<list.size(); i++) {
System.out.println("列表项为: "+list.get(i));
}
}
@Test
public void example1() {
System.out.println(
"/****************************************************\n" +
" * 示例1:Redis Java String(字符串) 实例\n" +
" * @date " + sdf.format(new Date()) + "\n" +
" **************************************************/"
);
//设置 redis 字符串数据
jedis.set("runoobkey", "www.runoob.com");
// 获取存储的数据并输出
System.out.println("redis 存储的字符串为: "+ jedis.get("runoobkey"));
}
}