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ù)目,默認值為8;
//如果賦值為-1,則表示不限制;如果pool已經(jīng)分配了maxActive個jedis實例,則此時pool的狀態(tài)為exhausted(耗盡)。
public
static
int
MAX_ACTIVE =
1024
;
//控制一個pool最多有多少個狀態(tài)為idle(空閑的)的jedis實例,默認值也是8。
public
static
int
MAX_IDLE =
200
;
//等待可用連接的最大時間,單位毫秒,默認值為-1,表示永不超時。如果超過等待時間,則直接拋出JedisConnectionException;
public
static
int
MAX_WAIT =
10000
;
public
static
int
TIMEOUT =
10000
;
public
static
int
RETRY_NUM =
5
;
}