1. 基于Redis
1.1 加锁
java
setnx lockKey uniqueValue
1.2 解锁
基于Lua脚本保证解锁的原子性。Redis在执行Lua脚本时,可以以原子性的方式执行,确保原子性。
java
if redis.call("get", keys[1]) == argv[1] then
return redis.call("del", keys[1])
else
return 0
end
1.3 避免锁无法被释放
给key设置过期时间
set lockKey uniqueValue EX 3 NX
1.4 优雅续期
Redisson的分布式锁自带自动续期机制,提供专门用来监控和续期的Watch Dog看门狗,如果操作的共享资源的线程还未执行完的话,Watch Dog会不断延长锁的过期时间,进而保证锁不会因为超时而释放。
默认每过10秒,看门狗会将锁的超时时间设置为30秒。
2. Redisson
java
RLock lock = redisson.getLock("myLock");
try {
// 超时等待,锁自动释放
// 尝试获取锁,最多等待100秒,锁自动释放时间为10秒
if (lock.tryLock(100, 10, TimeUnit.SECONDS)) {
// 临界区代码
System.out.println("Got the lock!");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 锁被当前线程持有,才会进行释放锁
if (lock.isHeldByCurrentThread()) {
lock.unlock();
}
}