redis分布式锁

540 阅读1分钟
@Slf4j
@Component

public class RedisLockUtil {

    @Autowired
    private RedisTemplate redisTemplate;
    @Value("${lock.enabled:false}")
    private Boolean enableLock;

    private static final long DEFUAL_EXPIRE_TIME_S = 10L;

    private static final long DEFUAL_ROLL_TIME_S = 5L;

    public Boolean lock(String key){
        return lock(key,DEFUAL_ROLL_TIME_S);
    }

    public Boolean lock(String key, Long timeOut){
        if(!enableLock){
            log.info("enableLock = {}", enableLock);
            return Boolean.TRUE;
        }
        long begin = System.nanoTime();
        Boolean result = (Boolean) redisTemplate.execute((RedisCallback) action -> {
            do {
                Boolean r = action.setNX(key.getBytes(), key.getBytes());
                if (r) {
                    r = action.expire(key.getBytes(), RedisLockUtil.DEFUAL_EXPIRE_TIME_S);
                    log.info("get lock by key = {} result = {}", key, r);
                    return r;
                } else {
                    log.info("get lock by key = {} fail", key);
                }
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    log.error("lock error", e);
                }
            } while (TimeUnit.NANOSECONDS.toSeconds(System.nanoTime()-begin) < timeOut);
            return Boolean.FALSE;
        });
        return result;
    }

    public  void unLock(String key) {
        if(!enableLock){
            log.info("enableLock = {}", enableLock);
            return ;
        }
        redisTemplate.delete(key);
        log.info("lock unLock key = {}", key);
    }
}

本文由博客一文多发平台 OpenWrite 发布!