Jedis工具类(含分布式锁的调用和释放)
个人把工具类分为两部分:
一、连接池部分
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import redis.clients.jedis.*; import java.io.InputStream; import java.util.Properties; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class JedisPoolUtil { protected static Logger logger = LoggerFactory.getLogger(JedisPoolUtil.class); public static JedisPool jedisPool = null; private String host; private int port; private int maxTotal; private int maxIdle; private int minIdle; private boolean blockWhenExhausted; private int maxWaitMillis; private boolean testOnBorrow; private boolean testOnReturn; public static Lock lock = new ReentrantLock(); private void initialConfig() { try { InputStream stream = JedisUtilBak.class.getClassLoader().getResourceAsStream("config.properties"); Properties prop = new Properties(); prop.load(stream); host = prop.getProperty("redis.host"); port = Integer.parseInt(prop.getProperty("redis.port")); maxTotal = Integer.parseInt(prop.getProperty("redis.maxTotal")); maxIdle = Integer.parseInt(prop.getProperty("redis.maxIdle")); minIdle = Integer.parseInt(prop.getProperty("redis.minIdle")); blockWhenExhausted = Boolean.parseBoolean(prop.getProperty("redis.blockWhenExhausted")); maxWaitMillis = Integer.parseInt(prop.getProperty("redis.maxWaitMillis")); testOnBorrow = Boolean.parseBoolean(prop.getProperty("redis.testOnBorrow")); testOnReturn = Boolean.parseBoolean(prop.getProperty("redis.testOnReturn")); // boolean testWhileIdle = Boolean.parseBoolean(prop.getProperty("redis.testWhileIdle")); // int timeBetweenEvictionRunsMillis = Integer.parseInt(prop.getProperty("redis.timeBetweenEvictionRunsMillis")); // int minEvictableIdleTimeMillis = Integer.parseInt(prop.getProperty("redis.minEvictableIdleTimeMillis")); // int numTestsPerEvictionRun = Integer.parseInt(prop.getProperty("redis.numTestsPerEvictionRun")); } catch (Exception e) { logger.debug("parse configure file error."); } } /** * initial redis pool */ private void initialPool() { if (lock.tryLock()) { lock.lock(); initialConfig(); try { JedisPoolConfig config = new JedisPoolConfig(); config.setMaxTotal(maxTotal); config.setMaxIdle(maxIdle); config.setMaxWaitMillis(maxWaitMillis); config.setTestOnBorrow(testOnBorrow); jedisPool = new JedisPool(config, host, port); } catch (Exception e) { logger.debug("init redis pool failed : {}", e.getMessage()); } finally { lock.unlock(); } } else { logger.debug("some other is init pool, just wait 1 second."); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } public Jedis getJedis() { if (jedisPool == null) { initialPool(); } try { return jedisPool.getResource(); } catch (Exception e) { logger.debug("getJedis() throws : {}" + e.getMessage()); } return null; } public Pipeline getPipeline() { BinaryJedis binaryJedis = new BinaryJedis(host, port); return binaryJedis.pipelined(); } }
二、操作方法部分
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import redis.clients.jedis.Jedis; import redis.clients.jedis.Tuple; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.locks.ReentrantLock; public class JedisUtil { protected static Logger logger = LoggerFactory.getLogger(JedisUtil.class); public static ReentrantLock lock = new ReentrantLock(); private final String DIST_LOCK_SUCCESS = "OK"; private final Long DIST_LOCK_RELEASE_SUCCESS = 1L; private final String SET_IF_NOT_EXIST = "NX"; private final String SET_WITH_EXPIRE_TIME = "PX"; private JedisPoolUtil jedisPool = new JedisPoolUtil(); public boolean setString(String key, String value) { Jedis jedis = jedisPool.getJedis(); try { jedis.set(key, value); return true; } catch (Exception e) { logger.debug("setString() key {} throws:{}", key, e.getMessage()); return false; } finally { close(jedis); } } public boolean setStringEx(String key, int seconds, String value) { Jedis jedis = jedisPool.getJedis(); try { jedis.setex(key, seconds, value); return true; } catch (Exception e) { logger.debug("setStringEx() key {} throws:{}",key, e.getMessage()); return false; } finally { close(jedis); } } public String getString(String key) { Jedis jedis = jedisPool.getJedis(); try { return jedis.get(key); } catch (Exception e) { logger.debug("getString() key {} throws:{}", key,e.getMessage()); return null; } finally { close(jedis); } } public boolean delString(String key) { Jedis jedis = jedisPool.getJedis(); try { jedis.del(key); return true; } catch (Exception e) { logger.debug("delString() key {} throws:{}", key,e.getMessage()); return false; } finally { close(jedis); } } public boolean delHash(String key, String mKey) { Jedis jedis = jedisPool.getJedis(); try { jedis.hdel(key, mKey); return true; } catch (Exception e) { logger.debug("setHash() key {} throws:{}", key,e.getMessage()); return false; } finally { close(jedis); } } public boolean setHash(String key, String mKey, String mVal) { Jedis jedis = jedisPool.getJedis(); try { jedis.hset(key, mKey, mVal); return true; } catch (Exception e) { logger.debug("setHash() key {} throws:{}", key,e.getMessage()); return false; } finally { close(jedis); } } public String getHash(String key, String mKey) { Jedis jedis = jedisPool.getJedis(); try { return jedis.hget(key, mKey); } catch (Exception e) { logger.debug("setHash() key {} throws:{}", key,e.getMessage()); } finally { close(jedis); } return null; } public boolean setHashMulti(String key, Map<String, String> map) { Jedis jedis = jedisPool.getJedis(); try { jedis.hmset(key, map); return true; } catch (Exception e) { logger.debug("setMHash() key {} throws:{}", key,e.getMessage()); return false; } finally { close(jedis); } } public List<String> getHashMulti(String key, String[] members) { Jedis jedis = jedisPool.getJedis(); try { return jedis.hmget(key, members); } catch (Exception e) { logger.debug("getHashMulti() key {} throws:{}", key,e.getMessage()); } finally { close(jedis); } return null; } public List<String> getHashValsAll(String key) { Jedis jedis = jedisPool.getJedis(); try { return jedis.hvals(key); } catch (Exception e) { logger.debug("getHashValsAll() key {} throws:{}", key,e.getMessage()); } finally { close(jedis); } return null; } public Set<String> getHashKeysAll(String key) { Jedis jedis = jedisPool.getJedis(); try { return jedis.hkeys(key); } catch (Exception e) { logger.debug("getHashValsAll() key {} throws:{}", key,e.getMessage()); } finally { close(jedis); } return null; } public boolean addScoreSet(String key, String mKey, int score) { Jedis jedis = jedisPool.getJedis(); try { jedis.zadd(key, score, mKey); return true; } catch (Exception e) { logger.debug("addScoreSet() key {} throws:{}", key,e.getMessage()); return false; } finally { close(jedis); } } public boolean delScoreSet(String key, String mKey) { Jedis jedis = jedisPool.getJedis(); try { jedis.zrem(key, mKey); return true; } catch (Exception e) { logger.debug("delScoreSet() key {} throws:{}", key,e.getMessage()); return false; } finally { close(jedis); } } public boolean changeScoreSet(String key, String mKey, int score) { Jedis jedis = jedisPool.getJedis(); try { jedis.zincrby(key, score, mKey); return true; } catch (Exception e) { logger.debug("changeScoreSet() key {} throws:{}", key,e.getMessage()); return false; } finally { close(jedis); } } public Set<String> listScoreSetString(String key, int start, int end, boolean asc) { Jedis jedis = jedisPool.getJedis(); try { if (asc) { return jedis.zrange(key, start, end); } else { return jedis.zrevrange(key, start, end); } } catch (Exception e) { logger.debug("listScoreSetString() key {} throws:{}", key,e.getMessage()); } finally { close(jedis); } return null; } public Set<Tuple> listScoreSetTuple(String key, int start, int end, boolean asc) { Jedis jedis = jedisPool.getJedis(); try { if (asc) { return jedis.zrangeWithScores(key, start, end); } else { return jedis.zrevrangeWithScores(key, start, end); } } catch (Exception e) { logger.debug("listScoreSetString() key {} throws:{}", key,e.getMessage()); } finally { close(jedis); } return null; } public boolean getDistributedLock(String lockKey, String requestId, int expireTime) { Jedis jedis = jedisPool.getJedis(); try { String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime); if (DIST_LOCK_SUCCESS.equals(result)) { return true; } return false; } catch (Exception e) { // logger.debug("getDistributedLock key {} throws:{}", lockKey, e.getMessage()); logger.debug("getDistributedLock throws {}", e); } finally { close(jedis); } return false; } public boolean releaseDistributedLock(String lockKey, String requestId) { Jedis jedis = jedisPool.getJedis(); try { String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end"; Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId)); if (DIST_LOCK_RELEASE_SUCCESS.equals(result)) { return true; } return false; } catch (Exception e) { logger.debug("releaseDistributedLock throws {}", e.getMessage()); } finally { close(jedis); } return false; } public void close(Jedis jedis) { if (jedis != null) { jedis.close(); } } }
上善若水,水利万物而不争。