redis分布式锁

加锁代码如下:

/**
 * @param key      要加锁的key
 * @param expireAt millis 加锁时间戳
 * @return 加锁成功返回true
 */
public boolean lock(String key, long expireAt) {
    long now = ensure(expireAt);
    Boolean open = redisTemplate.opsForValue().setIfAbsent(key, expireAt);
    if (open) {
        redisTemplate.expire(key, expireAt - now, TimeUnit.MILLISECONDS);
    } else {
        Long oldTtl = redisTemplate.opsForValue().get(key);
        if (null == oldTtl || oldTtl < now) {
            Long preTtl = redisTemplate.opsForValue().getAndSet(key, expireAt);
            if (null == preTtl || preTtl.equals(oldTtl)) {
                return true;
            }
        }
    }
    return open == null ? false : open;
}

/**
 * 解锁
 *
 * @param key      key
 * @param expireAt millis ,时间戳,只有与加锁时指定的相同时才生效
 */
public void unlock(String key, long expireAt) {
    Long ttl = redisTemplate.opsForValue().get(key);
    if (null == ttl || expireAt == ttl) {
        redisTemplate.delete(key);
    }
}

private long ensure(long expireAt) {
    long now = System.currentTimeMillis();
    if (now >= expireAt) throw new IllegalArgumentException("'expireAt' must be positive");
    return now;
}
}

使用时如:


Long expireAt = System.currentTimeMillis() + 10 * 60 * 1000; // 加锁10分钟
if (redisLock.lock(RedisConstraint.sendDataSyncLockKey("some_key", expireAt)) {
    ....  
    redisLock.unlock(RedisConstraint.sendDataSyncLockKey("some_key", expireAt);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值