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設定為一個足夠長的時間,以容納任務執行的最大可能時間。但是,請注意不要設定得太長,以避免因為鎖被意外持有而導致的其他問題。