public classRedisUtil {protected Logger log =LoggerFactory.getLogger(getClass());private static Map maps = new HashMap();/*** 私有构造器.*/
privateRedisUtil() {
}/*** 获取连接池.
*@return连接池实例*/
private static JedisPool getPool(String ip,intport) {
String key= ip+":" +port;
JedisPool pool= null;if(!maps.containsKey(key)) {
JedisPoolConfig config= newJedisPoolConfig();
config.setMaxActive(RedisConfig.Maxactive);
config.setMaxIdle(RedisConfig.Maxidle);
config.setMaxWait(RedisConfig.Maxwait);
config.setTestOnBorrow(true);
config.setTestOnReturn(true);try{/***如果你遇到 java.net.SocketTimeoutException: Read timed out exception的异常信息
*请尝试在构造JedisPool的时候设置自己的超时值. JedisPool默认的超时时间是2秒(单位毫秒)*/pool= newJedisPool(config, ip, port,RedisConfig.Timeout);
maps.put(key, pool);
}catch(Exception e) {
e.printStackTrace();
}
}else{
pool=maps.get(key);
}returnpool;
}public staticJedisPool getPool()
{returngetPool(RedisConfig.ip,RedisConfig.port);
}/***类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例
*没有绑定关系,而且只有被调用到时才会装载,从而实现了延迟加载。*/
private static classRedisUtilHolder{/*** 静态初始化器,由JVM来保证线程安全*/
private static RedisUtil instance = newRedisUtil();
}/***当getInstance方法第一次被调用的时候,它第一次读取
*RedisUtilHolder.instance,导致RedisUtilHolder类得到初始化;而这个类在装载并被初始化的时候,会初始化它的静
*态域,从而创建RedisUtil的实例,由于是静态的域,因此只会在虚拟机装载类的时候初始化一次,并由虚拟机来保证它的线程安全性。
*这个模式的优势在于,getInstance方法并没有被同步,并且只是执行一个域的访问,因此延迟初始化并没有增加任何访问成本。*/
public staticRedisUtil getInstance() {returnRedisUtilHolder.instance;
}/*** 获取Redis实例.
*@returnRedis工具类实例*/
private static Jedis getJedis(String ip, intport) {
Jedis jedis= null;int count = 0;do{try{
jedis=getPool(ip, port).getResource();//log.info("get redis master1!");
} catch(Exception e) {//log.error("get redis master1 failed!", e);//销毁对象
getPool(ip, port).returnBrokenResource(jedis);
}
count++;
}while (jedis == null && count
}//重载一下
public staticJedis getJedis()
{returngetJedis(RedisConfig.ip,RedisConfig.port);
}/*** 释放redis实例到连接池.
*@paramjedis redis实例*/
private static void closeJedis(Jedis jedis,String ip,intport) {if(jedis != null) {
getPool(ip,port).returnResource(jedis);
}
}public static voidcloseJedis(Jedis jedis)
{
closeJedis(jedis,RedisConfig.ip,RedisConfig.port);
}/*** 退出然后关闭Jedis连接。如果Jedis为null则无动作。*/
public static voidcloseJedisDirectly(Jedis jedis) {if ((jedis != null) &&jedis.isConnected()) {try{try{
jedis.quit();
}catch(Exception e) {
}
jedis.disconnect();
}catch(Exception e) {
}
}
}
}