為了確保分布式鎖可用,我們要確保鎖的實現同時滿足以下四個條件:
- 互斥性。在任意時刻,只有一個客戶端能持有鎖。
- 不會發生死鎖。即使有一個客戶端在持有鎖的期間崩潰而沒有主動解鎖,也能保證后續其他客戶端能加鎖。
- 解鈴還須系鈴人。加鎖和解鎖必須是同一個客戶端,客戶端自己不能把別人加的鎖給解了。
- 加鎖和解鎖必須具有原子性
而這四個條件,Redisson實現的分布式鎖都可以滿足,同時Redisson實現的分布式鎖,還是可重入的。
@Service
public class TestServiceImpl implements TestService {@AutowiredRedissonClient redissonClient;@Overridepublic void incrWithLock() {// 獲取鎖RLock redisLock = redissonClient.getLock("lock:number");try {// 加鎖,失敗會在這里阻塞redisLock.lock();// 加鎖成功,代碼執行到這里RBucket<Integer> bucket = redissonClient.getBucket("number");// 獲取key為number的value值int number = bucket.get();// 自增1number++;// 在放回redisbucket.set(number);} finally {// 釋放鎖redisLock.unlock();}}
}