zoukankan      html  css  js  c++  java
  • 分布式锁-redis

    @Autowired
        private RedisTemplate<String, Object> redisTemplate;
    
    
    /**
         * 获取分布式锁 - 过期时间
         * @param key
         * @param expireTime 毫秒
         * @return
         */
        public Object getExpiredLock(String key, Long expireTime) {
            Long value = System.currentTimeMillis() + expireTime;
            return redisTemplate.execute((RedisCallback) connection -> {
                int count = 3;
                while (count > 0) {
                    try {
                        JedisCommands commands = (JedisCommands) connection.getNativeConnection();
                        return commands.set(key, String.valueOf(value), "NX", "PX", expireTime);
                    } catch (Exception e) {
                        logger.error("getExpiredLock exception key={}, count={}:", key, count, e);
                        count--;
                    }
                }
                return null;
            });
        }
    
    
    /**
         * 获取分布式锁 - 过期时间,value
         * @param key
         * @param expireTime
         * @return
         */
        public Object getExpiredLock(String key, Long expireTime, String value) {
            return redisTemplate.execute((RedisCallback) connection -> {
                int count = 3;
                while (count > 0) {
                    try {
                        JedisCommands commands = (JedisCommands) connection.getNativeConnection();
                        return commands.set(key, value, "NX", "PX", expireTime);
                    } catch (Exception e) {
                        logger.error("getExpiredLock exception key={}, count={}:", key, count, e);
                        count--;
                    }
                }
                return null;
            });
        }
    
    /**
         * 获取分布式锁value
         * @param key
         * @return
         */
        public Object getValue4ExpiredLock(String key) {
            return redisTemplate.execute((RedisCallback) connection -> {
                int count = 3;
                while (count > 0) {
                    try {
                        JedisCommands commands = (JedisCommands) connection.getNativeConnection();
                        return commands.get(key);
                    } catch (Exception e) {
                        logger.error("getExpiredLock exception key={}, count={}:", key, count, e);
                        count--;
                    }
                }
                return null;
            });
        }
    
    
    /**
         * 删除任务队列锁
         * @param lockKey
         */
        public void deleteLock(String lockKey) {
            int count = 3;
            while (count > 0) {
                try {
                    if (redisTemplate.hasKey(lockKey) && Long.valueOf(""+getValue4ExpiredLock(lockKey)) > System.currentTimeMillis()) {
                        // 当前时间比该锁对应的value小,说明未过期,并占有该锁,可以直接删除
                        redisTemplate.delete(lockKey);
                        logger.info("删除list锁:{}", lockKey);
                    } else {
                        logger.info("任务锁已过期, taskListLockKey={}", lockKey);
                    }
                    break;
                } catch (Exception e) {
                    logger.error("deleteLock count={}", count, e);
                    count--;
                }
            }
    
        }
    

      

            // 获取分布式锁
            if (redisService.getExpiredLock(key, 5000L) == null) {
                return;
            }    
    
    
            // 删除分布式锁
             redisService.deleteLock(key);    
    

      

  • 相关阅读:
    【C++基础】重载,覆盖,隐藏
    【Lintcode】003.Digit Counts
    【C++ Primer 5th】Chapter 15
    【Lintcode】120.Word Ladder
    牛客网上的题
    二叉树中和为某个值得路径
    数据库
    二叉搜索树的后序遍历序列
    从上往下打印二叉树
    二叉树的镜像
  • 原文地址:https://www.cnblogs.com/wanhua-wu/p/11929297.html
Copyright © 2011-2022 走看看