/**
* 加锁,无阻塞
*
* @param key 对应得key
* @param expireTime 过期时间
* @param timeout 自旋时间
* @return
*/
public Boolean lock(String key, long expireTime,Long timeout) {
String requestId = UUID.randomUUID().toString();
Long start = System.currentTimeMillis();
//自旋,在一定时间内获取锁,超时则返回错误
for (; ; ) {
//Set命令返回OK,则证明获取锁成功
Boolean ret = redisTemplate.opsForValue().setIfAbsent(key, requestId, expireTime,
TimeUnit.SECONDS);
if (ret!=null && ret) {
return true;
}
//否则循环等待,在timeout时间内仍未获取到锁,则获取失败
long end = System.currentTimeMillis() - start;
if (end >= timeout) {
return false;
}
}
}
redis自旋锁
于 2024-05-08 18:11:32 首次发布