基于Zookeeper實現(xiàn)分布式鎖
基于zookeeper臨時有序節(jié)點可以實現(xiàn)的分布式鎖。大致思想即為:每個客戶端對某個方法加鎖時浅乔,在zookeeper上的與該方法對應(yīng)的指定節(jié)點的目錄下倔喂,生成一個唯一的瞬時有序節(jié)點。 判斷是否獲取鎖的方式很簡單,只需要判斷有序節(jié)點中序號最小的一個滴劲。 當釋放鎖的時候攻晒,只需將這個瞬時節(jié)點刪除即可。同時班挖,其可以避免服務(wù)宕機導致的鎖無法釋放鲁捏,而產(chǎn)生的死鎖問題。
可以直接使用zookeeper 第三方庫Curator客戶端萧芙,這個客戶端中封裝了一個可重入的鎖服務(wù)给梅。
基于緩存實現(xiàn)分布式鎖
基于Redis
使用 Redis 的客戶端 Redisson
<!-- JDK 1.8+ compatible -->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.3.1</version>
</dependency>
<!-- JDK 1.6+ compatible -->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>2.8.1</version>
</dependency>
Redisson Lock API:
RLock lock = redisson.getLock("anyLock");
// Most familiar locking method
lock.lock();
// Lock time-to-live support
// releases lock automatically after 10 seconds
// if unlock method not invoked
lock.lock(10, TimeUnit.SECONDS);
// Wait for 100 seconds and automatically unlock it after 10 seconds
boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);
...
lock.unlock();
基于Tair
參考資料
Curator Recipes
跟著實例學習ZooKeeper的用法: 分布式鎖
《Redis官方文檔》用Redis構(gòu)建分布式鎖
Redisson Distributed locks and synchronizers