Redis:分布式锁方法封装

发布于 2021-12-02  1525 次阅读


    /**
     * 释放锁脚本,原子操作
     */
    private final static DefaultRedisScript<Long> UNLOCK_LUA_SCRIPT = new DefaultRedisScript<>(
            "if redis.call('get',KEYS[1]) == ARGV[1] then return redis.call('del',KEYS[1]) else return -1 end"
            , Long.class
    );

获取锁

public boolean lock(String key, String requestId, long expireTime) {
        log.info("获取分布式锁key==>{},requestId==>{},expireTime==>{}", key, requestId, expireTime);
        Boolean getLock;
        int getLockTimes = 0;
        try {
            while (getLockTimes < get_Lock_Times) {
                getLock = redisTemplate.opsForValue().setIfAbsent(key, requestId, Duration.ofMillis(expireTime));
                if (null != getLock && getLock) {
                    return true;
                }
                getLockTimes++;
            }
        } catch (Exception e) {
            log.error("获取分布式锁失败========>", e);
            return false;
        }

        return false;
    }

释放锁

 public boolean unlock(String key, String requestId) {
        log.info("释放分布式锁key==>{},requestId==>{}", key, requestId);
        int releaseLockTimes = 0;
        //释放锁
        try {
            while (releaseLockTimes < release_Lock_Times) {
                Long result = redisTemplate.execute(UNLOCK_LUA_SCRIPT, Arrays.asList(key), requestId);
                if (null != result && result == 1) {
                    return true;
                }
                releaseLockTimes++;
            }
        } catch (Exception e) {
            log.error("释放分布式锁失败========>", e);
        }
        return false;
    }

欢迎欢迎~热烈欢迎~