RLock lock = redissonClient.getLock("lock:order:" + order)
;和redissonDistributedLocker.tryLock("lock:order:" + order, TimeUnit.SECONDS, RedisLockKey.DEFAULT_WAIT_TIME, RedisLockKey.DEFAULT_HOLD_TIME);
這兩種加鎖方式的區別如下:
-
基本的加鎖方式 (RLock)
RLock lock = redissonClient.getLock("lock:order:" + order);
獲取鎖: 通過 redissonClient.getLock() 獲取一個 RLock 對象,并且傳入一個鍵(key),這個鍵可以是任何字符串。這里的鍵是
"lock:order:" + order
,它通常是基于某個業務標識(比如訂單號)來唯一標識鎖的。這樣,每個訂單的鎖就是唯一的,其他訂單不會被影響。
鎖的操作: 可以使用 lock.lock() 來請求鎖,lock.unlock() 來釋放鎖。它還支持帶超時的鎖,例如lock.tryLock(long waitTime, long leaseTime, TimeUnit unit)
,這可以控制等待的時間和鎖的持有時間。
鎖的特點: 這種方式是直接通過 Redisson API 操作鎖的基礎方式,較為簡單和直接。 -
使用
RedissonDistributedLocker.tryLock()
redissonDistributedLocker.tryLock("lock:order:" + order,TimeUnit.SECONDS,RedisLockKey.DEFAULT_WAIT_TIME,RedisLockKey.DEFAULT_HOLD_TIME);
獲取鎖:
redissonDistributedLocker
是一個封裝了 Redisson 鎖操作的工具類,它通常用于對鎖的獲取和釋放進行更高層次的封裝和抽象。tryLock 是嘗試獲取鎖的方法,可以指定等待時間和鎖持有時間。"lock:order:" + order
作為鎖的 keytryLock 方法通常有以下幾個參數:
鎖的名稱: 即鎖的 key,這里傳入了一個包含業務標識的值。
等待時間: 即如果鎖被占用,最多等待的時間,單位通常是秒或毫秒。
持有時間: 獲取到鎖后,鎖自動過期的時間,也就是鎖的最大持有時間。即使操作沒有結束,鎖也會在這個時間后自動釋放。
單位: 時間單位,可以是秒、毫秒等。鎖的操作: tryLock 會嘗試獲取鎖,如果鎖被占用,且沒有在 DEFAULT_WAIT_TIME 規定的時間內成功獲取鎖,則會放棄,返回 false。如果獲取成功,則鎖會在 DEFAULT_HOLD_TIME 時間后自動釋放。這個機制有助于避免死鎖和長時間占用鎖。
-
主要區別
封裝和簡化:redissonDistributedLocker.tryLock()
是對 Redisson 鎖操作的封裝,提供了更高層次的 API,使得鎖的操作更加簡便且靈活,減少了需要手動處理的鎖等待和持有時間等邏輯。相比之下,直接使用 RLock 的方法可能需要你手動處理更多的邏輯(如等待、超時等)。
鎖的超時管理:
RLock 本身提供了 lock() 和 tryLock() 方法,可以通過 tryLock(long waitTime, long leaseTime, TimeUnit unit)
來設置等待時間和鎖持有時間。
redissonDistributedLocker.tryLock()
通過封裝的方式,簡化了這種超時管理,它會在超時后自動返回失敗或自動釋放鎖,減少了代碼的復雜度。
使用場景:
RLock 適用于你需要更多控制或者自定義邏輯的場景,比如需要自己處理鎖等待時間、持有時間等。
redissonDistributedLocker 更適合在業務中封裝常見的分布式鎖操作,它提供了簡單的 API 以便快速實現分布式鎖,特別是當你有一套統一的鎖處理邏輯時。