package net.caiban.utils.cache; import java.io.IOException; import java.util.Map; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import net.caiban.utils.file.PropertiesUtil; import org.apache.log4j.Logger; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; import redis.clients.jedis.Protocol; /** * @author parox * * jedis prject: https://github.com/xetorthio/jedis <br /> * * Example: <br /> * Jedis jedis = null; * try { * jedis = JedisUtil.getJedis(); * * Set<String> tags = jedis.keys("*"); * * } catch (Exception e) { * e.printStackTrace(); * }finally{ * JedisUtil.getPool().returnResource(jedis); * } * */ public class JedisUtil { private static JedisPool pool; private static Lock lock = new ReentrantLock(); private static Logger LOG = Logger.getLogger(JedisUtil.class); private static final String DEFAULT_PROP="redis.properties"; private static final String DEFAULT_CHARSET="utf-8"; public static JedisPool getPool(){ if(pool == null){ createPool(null, DEFAULT_CHARSET); } return pool; } public static void initPool(String prop){ if(prop==null){ prop=DEFAULT_PROP; } createPool(prop, DEFAULT_CHARSET); } private static void createPool(String prop, String charset){ if(pool == null){ LOG.debug("Jedis pool is not exist, lock and create pool."); lock.lock(); if(pool!=null){ lock.unlock(); } try { Map<String, String> conf = PropertiesUtil.read(prop, charset); String host = conf.get("redis.server"); String confPort = conf.get("redis.server.port"); int port = (confPort==null || "".equals(confPort))?Protocol.DEFAULT_PORT:Integer.valueOf(confPort); JedisPoolConfig config =new JedisPoolConfig(); //TODO config by properties pool = new JedisPool(config, host, port); } catch (IOException e) { LOG.error("Error occurred when create jedis pool.", e); }finally{ lock.unlock(); } } } // public static Jedis getJedis(){ // try { // Jedis jedis = getPool().getResource(); // return jedis; // } catch (Exception e) { // LOG.error("Error occurred when get jedis client from pool.", e); // } // return null; // } public static void returnJedis(Jedis jedis){ if(jedis==null){ return ; } getPool().returnResource(jedis); } public static void returnBrokenJedis(Jedis jedis){ if(jedis!=null){ getPool().returnBrokenResource(jedis); } } }