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);    
    

      

  • 相关阅读:
    centos7.2安装配置
    CentOS系统操作mysql的常用命令
    MySQL5.7安装与配置(YUM)
    排序的空间复杂度和尾递归小记
    常见内排序实现汇总(含部分优化实现,基于链表的实现),以及性能比较
    [ASP.NET]从ASP.NET Postback机制,到POST/GET方法
    内存管理笔记(分页,分段,逻辑地址,物理地址与地址转换方式)
    [EXT JS]"hasMany" association on ExtJS 4.1.1a
    使用nodejs抓取博客园内容---Promise模块探索
    NodeJs + mongodb模块demo
  • 原文地址:https://www.cnblogs.com/wanhua-wu/p/11929297.html
Copyright © 2011-2022 走看看