使用RedisTemplate获取分布式锁和解锁
获取锁:setIfAbsent()方法
/**
* 加锁,无阻塞
* timeout = 300
* @param key
* @param expireTime
* @return
*/
private Boolean lock(String key, long expireTime) {
String requestId = UUID.randomUUID().toString();
Long start = System.currentTimeMillis();
//自旋,在一定时间内获取锁,超时则返回错误
for (; ; ) {
//Set命令返回OK,则证明获取锁成功
Boolean ret = redisTemplate.opsForValue().setIfAbsent(key, requestId, expireTime,
TimeUnit.SECONDS);
if (ret) {
return true;
}
//否则循环等待,在timeout时间内仍未获取到锁,则获取失败
long end = System.currentTimeMillis() - start;
if (end >= timeout) {
return false;
}
}
}
解锁:删除对应的key即可
private void unlock(String key) {
redisTemplate.delete(key);
}