基于redisTemplete实现分布式锁(lua脚本)

252 阅读1分钟
private static final Long SUCCESS = 1L;

/**
 * 获取锁
 * @param lockKey
 * @param value
 * @param expireTime:单位-秒
 * @return
 */
public static boolean getLock(String lockKey, String value, int expireTime){
    boolean ret = false;
    try{
        String script = "if redis.call('setNx',KEYS[1],ARGV[1])==1 then if redis.call('get',KEYS[1])==ARGV[1] then return redis.call('expire',KEYS[1],ARGV[2]) else return 0 end end";

        RedisScript<String> redisScript = new DefaultRedisScript<>(script, String.class);

        Object result = redisTemplate.execute(redisScript, Collections.singletonList(lockKey),value,expireTime);

        if(SUCCESS.equals(result)){
            return true;
        }

    }catch(Exception e){

    }
    return ret;
}

/**
 * 释放锁
 * @param lockKey
 * @param value
 * @return
 */
public static boolean releaseLock(String lockKey, String value){

    String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";

    RedisScript<String> redisScript = new DefaultRedisScript<>(script, String.class);

    Object result = redisTemplate.execute(redisScript, Collections.singletonList(lockKey),value);
    if(SUCCESS.equals(result)) {
        return true;
    }

    return false;
}

案例不支持redis cluster模式