Redis实现分布式锁2

redisTemplate实现分布式锁
/**
     * 分布式锁-加锁
     * @param key
     * @param value 当前时间+超时时间  System.currentTimeMillis()+timeout
     * @return
     */
    public boolean lock(String key, String value) {
        //SETNX命令, 可以设置返回true, 不可以返回false
        if (redisTemplate.opsForValue().setIfAbsent(key, value)) {
            return true;
        }
        Object obj = redisTemplate.opsForValue().get(key);
        //如果锁过期
        Long time= (obj !=null) ? Long.parseLong((String)obj) :0;
        if (time< System.currentTimeMillis()) {
            Object obj1  = redisTemplate.opsForValue().getAndSet(key, value);//getAndSet 取出旧值,设置新值
            Long time1= (obj1 !=null) ? Long.parseLong((String)obj1) :0;
            if(time1 < Long.valueOf(value)) return true;
        }
        return false;
    }
    /**
     * 分布式锁-解锁
     */
    public void unLock(String key, String value) {
        try {
            Object obj = redisTemplate.opsForValue().get(key);
            String oldVaue= (obj !=null) ? (String)obj : "0";
            if (oldVaue.equals(value)) {
                redisTemplate.opsForValue().getOperations().delete(key);
            }
        } catch (Throwable e) {
            logger.error("[redis分布式锁] 解锁异常, {}", e.getMessage(), e);
        }
    }

  

原文地址:https://www.cnblogs.com/brant/p/10448195.html