import org.apache.log4j.Logger;
import com.yjhl.framework.base.PropertyUtil;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
*
* 类名: RedisPool <br/>
* 方法: redis连接池. <br/>
* 详细描述: 描述. <br/>
* 创建时间: 2016年11月15日 上午11:52:24 <br/>
*
* @author cyj
* @version
* @since JDK 1.8
*/
public final class RedisPool {
private static Logger logger = Logger.getLogger(RedisPool.class);
private static JedisPool jedisPool = null;
/**
*
*/
private static final String REDIS_CONFIG_RESOURCE = "config/redis-config.properties";
private static final String PORT = "PORT";
private static final String ADDR = "ADDR";
private static final String AUTHPASSWORD = "AUTHPASSWORD";
private static final String TIMEOUT = "TIMEOUT";
/**
* 初始化Redis连接池
*/
static {
try {
int port = Integer.parseInt(PropertyUtil.getPropertyValue(REDIS_CONFIG_RESOURCE, PORT));
String addr = PropertyUtil.getPropertyValue(REDIS_CONFIG_RESOURCE, ADDR);
String auth_password = PropertyUtil.getPropertyValue(REDIS_CONFIG_RESOURCE, AUTHPASSWORD);
int timeout = Integer.parseInt(PropertyUtil.getPropertyValue(REDIS_CONFIG_RESOURCE, TIMEOUT));
// 池基本配置
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(200);
config.setMaxIdle(50);
config.setMinIdle(8);// 设置最小空闲数
config.setMaxWaitMillis(1000 * 100);
config.setTestOnBorrow(true);
config.setTestOnReturn(true);
// Idle时进行连接扫描
config.setTestWhileIdle(true);
// 表示idle object evitor两次扫描之间要sleep的毫秒数
config.setTimeBetweenEvictionRunsMillis(30000);
// 表示idle object evitor每次扫描的最多的对象数
config.setNumTestsPerEvictionRun(10);
// 表示一个对象至少停留在idle状态的最短时间,然后才能被idle object
// evitor扫描并驱逐;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义
config.setMinEvictableIdleTimeMillis(60000);
jedisPool = new JedisPool(config, addr, port, timeout, auth_password);
} catch (Exception e) {
logger.error(e);
}
}
/**
* 获取Jedis实例
*
* @return
*/
public static Jedis getJedis() {
Jedis resource = null;
try {
if (jedisPool != null) {
resource = jedisPool.getResource();
return resource;
} else {
return null;
}
} catch (Exception e) {
if(resource != null){
returnResource(resource);
resource = jedisPool.getResource();
}
logger.error(e);
}
return resource;
}
/**
* 释放redis资源</br>
*
* @param jedis
*/
public static void returnResource(Jedis jedis) {
try {
jedisPool.close();
} catch (Exception e) {
logger.error(e);
}
}
}
关于其中的各个参数我就不一一详述了
想要深入了解redis配置参数的点击进入→http://www.cnblogs.com/qq78292959/archive/2013/09/21/3331032.html
关于优化问题任重而道远。
上述是根据jedis获取redis资源池,实现了断线重连机制
jedis的returnResource方法已经过期,由close()方法代替,查看源码你会发现里面其实是释放掉了资源而不是关闭。
经常会报的一个错误获取不到资源池的看过来:
思路:你请求资源成功后然后释放资源,关于释放资源的时机此时容易出现纰漏......
正确操作应该是这样的:请求资源放在逻辑层的try catch内,如果放在访问资源池try catch的话会导致有时候请求并未完成就释放掉了资源,于是报了上述错误。
public String getStr(String key){
Jedis jedis = RedisPool.getJedis();
String str = null;
try {
if(jedis == null || !jedis.exists(key)){
return null;
}
str = jedis.get(key);
} catch (Exception e) {
jedis.close();
e.printStackTrace();
}finally{
jedis.close();
}
return str;
}