随笔Java 基于Redis分布式锁

Posted 醇氧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了随笔Java 基于Redis分布式锁相关的知识,希望对你有一定的参考价值。

public class RedisCache 

  @Autowired
    private RedisTemplate redisTemplate;

    private Map<String, String> randomValueMap = new ConcurrentHashMap();

    /**
     * 将String类型值存入redis,并设置有效时间
     *
     * @param key
     * @param value
     * @param time  有效时间
     * @return
     */
    public boolean tryLock(String key, String value, long time) 
        try 
            String result = redisTemplate.execute(jedis -> jedis.set(key, value, "nx", "ex", time));
            if (result == null) 
                return false;
            
            this.randomValueMap.put(key, value);
            return true;
         catch (Exception e) 
            log.error("redis tryLock exception !", e);
            return false;
        
    


    /**
     * 分布式锁解锁(原子操作)
     *
     * @param lockKey
     * @return
     */
    public boolean unLock(String lockKey) 
        try 
            return ((Boolean) this.redisTemplate.execute((jedis) -> 
                String localLockedValue = (String) this.randomValueMap.get(lockKey);
                String lockedValue = jedis.get(lockKey);
                if (lockedValue == null) 
                    this.randomValueMap.remove(lockKey);
                    return Boolean.valueOf(true);
                 else if (StringUtils.equals(lockedValue, localLockedValue)) 
                    if (jedis.del(lockKey).longValue() > 0L) 
                        this.randomValueMap.remove(lockKey);
                        return Boolean.valueOf(true);
                     else 
                        return Boolean.valueOf(false);
                    
                 else 
                    return Boolean.valueOf(false);
                
            )).booleanValue();
         catch (Exception e) 
            log.error("redis unLock exception !", e);
        
        return false;
    
  

这种方法是有缺陷的,如果没有显示释放锁,只是依赖Redis超时机制会出现内存泄漏。为什么会这个大家给你评论留言。

以上是关于随笔Java 基于Redis分布式锁的主要内容,如果未能解决你的问题,请参考以下文章

Redis 分布式锁的正确实现方式( Java 版 )

Redis分布式锁的正确实现方式(Java版)

Redis分布式锁的正确实现方式(Java版)

Redis 分布式锁的正确实现方式(Java版)(抄)

Java实现基于Redis的分布式锁

基于redis实现分布式锁