美文网首页
分布式锁

分布式锁

作者: 呆弱鸡 | 来源:发表于2018-10-19 09:32 被阅读0次

    需求:由于负载均衡,一个应用同时部署多台机器,jdk中的锁已经无法满足要求,需要做一个分布式锁。


    下面是基于redis的分布式锁:

    package a.b.c.d;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.stereotype.Component;
    import org.springframework.util.StringUtils;
    
    @Component
    public class RedisLock {
    
        @Autowired
        private StringRedisTemplate redisTemplate;
    
        /**
         * @param key
         * @param value 当前时间+超时时间(long毫秒)
         */
        public Boolean lock(String key, String value) {
    
            if (redisTemplate.opsForValue().setIfAbsent(key, value)) {
                return true;
            }
            String currentValue = redisTemplate.opsForValue().get(key);
            // 如果锁过期
            if (!StringUtils.isEmpty(currentValue)
                    && Long.parseLong(currentValue) < System.currentTimeMillis()) {
                // 获取上一个锁的时间
                String oldValue = redisTemplate.opsForValue().getAndSet(key, value);
                if (!StringUtils.isEmpty(oldValue)
                        && oldValue.equals(currentValue)) {
                    return true;
                }
            }
            return false;
        }
    
        public void unlock(String key, String value) {
            try {
                String currrentValue = redisTemplate.opsForValue().get(key);
                if (!StringUtils.isEmpty(currrentValue)
                        && currrentValue.equals(value)) {
                    redisTemplate.opsForValue().getOperations().delete(key);
                }
            } catch (Exception e) {
            }
    
        }
    }
    

    相关文章

      网友评论

          本文标题:分布式锁

          本文链接:https://www.haomeiwen.com/subject/yezezftx.html