由于网络延迟造成逻辑锁过期的问题
getLock {
..
网络波动,导致getLock获取的锁已过期失效,其他线程请求仍然可以执行这段逻辑
...
}
解决方案
redisson watch-dog
try {
// 尝试获取锁,如果获取成功,则执行任务
if (lock.tryLock(acquireTimeout, lockHoldTime, TimeUnit.SECONDS)) {
try {
// 执行任务
// ...
// 注意:由于RLock的自动续期机制,你不需要在这里手动续期锁
} finally {
if (lock != null) {
// 释放锁
lock.unlock();
}
}
} else {
// 无法获取锁,处理这种情况(例如,重试、记录日志、抛出异常等)
}
} catch (InterruptedException e) {
// 处理线程被中断的情况
Thread.currentThread().interrupt(); // 恢复中断状态
// ...
}
acquireTimeout: 尝试获取锁的最长时间
lockHoldTime: 锁被持有的时间。如果任务执行时间不确定,你应该将lockHoldTime设置为一个足够长的时间,以容纳任务执行的最大可能时间。但是,请注意不要设置得太长,以避免因为锁被意外持有而导致的其他问题。
1