zoukankan      html  css  js  c++  java
  • 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();
            }
        }
    }
  • 相关阅读:
    hihoCoder 1398 : 网络流五·最大权闭合子图
    hihoCoder:1394 : 网络流四·最小路径覆盖
    hihoCoder 1393: 网络流三·二分图多重匹配
    hihoCoder1378:网络流二·最大流最小割定理
    hihoCoder1369:网络流一·Ford-Fulkerson算法(FF算法)
    [NOIP2011]铺地毯(贪心)
    hdu 3452:Bonsai(最小割)
    hdu 3549:Flow Problem(最大流)
    (转载)JavaScript中定义变量
    (转载)浅谈javascript的分号
  • 原文地址:https://www.cnblogs.com/yoyotl/p/8677711.html
Copyright © 2011-2022 走看看