由于网络延迟造成逻辑锁过期的问题

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

posted @ 2024-11-12 18:01  volc1606  阅读(35)  评论(0编辑  收藏  举报