|
import org.apache.log4j.Logger;
import java.util.HashMap;
import java.util.Map;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisUtil
{
private Logger logger = Logger.getLogger(this.getClass().getName());
private JedisUtil(){}
private static class RedisUtilHolder{
private static final JedisUtil instance = new JedisUtil();
}
public static JedisUtil getInstance(){
return RedisUtilHolder.instance;
}
private static Map maps = new HashMap();
private static JedisPool getPool(String ip, int port){
String key = ip+':'+port;
JedisPool pool = null;
if(!maps.containsKey(key))
{
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxActive(RedisConfig.MAX_ACTIVE);
config.setMaxIdle(RedisConfig.MAX_IDLE);
config.setMaxWait(RedisConfig.MAX_WAIT);
config.setTestOnBorrow(true);
config.setTestOnReturn(true);
pool = new JedisPool(config,ip,port,RedisConfig.TIMEOUT);
maps.put(key, pool);
}
else
{
pool = maps.get(key);
}
return pool;
}
public Jedis getJedis(String ip, int port)
{
Jedis jedis = null;
int count = 0;
do
{
try
{
jedis = getPool(ip,port).getResource();
}
catch (Exception e)
{
logger.error('get redis master1 failed!',e);
getPool(ip,port).returnBrokenResource(jedis);
}
}
while(jedis == null && count
return jedis;
}
public void closeJedis(Jedis jedis, String ip, int port){
if(jedis != null)
{
getPool(ip,port).returnResource(jedis);
}
}
}
public class RedisConfig
{
//可用連接實例的最大數(shù)目,默認(rèn)值為8;
//如果賦值為-1,則表示不限制;如果pool已經(jīng)分配了maxActive個jedis實例,則此時pool的狀態(tài)為exhausted(耗盡)。
public static int MAX_ACTIVE = 1024;
//控制一個pool最多有多少個狀態(tài)為idle(空閑的)的jedis實例,默認(rèn)值也是8。
public static int MAX_IDLE = 200;
//等待可用連接的最大時間,單位毫秒,默認(rèn)值為-1,表示永不超時。如果超過等待時間,則直接拋出JedisConnectionException;
public static int MAX_WAIT = 10000;
public static int TIMEOUT = 10000;
public static int RETRY_NUM = 5;
}
|