1、主流分散式鎖實現方案
-
基於資料庫實現分散式鎖
-
基於快取(redis 等)
-
基於 Zookeeper
2、根據實現方式分類 :
- 類 CAS 自旋式分散式鎖:詢問的方式,類似 java 併發程式設計中的執行緒獲詢問的方式嘗試加鎖,如 mysql、redis。
- event 事件型別分散式鎖: event 事件通知程式後續鎖的變化,輪詢向外的過程,如 zookeeper、etcd*
3、Redis 實現分散式鎖流程
- 設定過期時間,自動釋放鎖,為了解決業務異常而導致鎖無法釋放。(但是當業務執行超過過期時間時,開闢監控執行緒增加該業務的執行時間,直到執行結束,釋放鎖。)
- 鎖和過期時間一起設定保證兩者原子性
- uuid, 手動釋放鎖前獲取鎖的值,防止誤刪鎖
4、實現虛擬碼
public void redisLock() throws InterruptedException {
String uuid = UUID.randomUUID().toString();
ValueOperations ops = redisTemplate.opsForValue();
Boolean lock = ops.setIfAbsent("lock", uuid, 3000, TimeUnit.SECONDS);
if (lock) {
System.out.println("執行業務程式碼");
if (uuid.equals(ops.get("lock"))) {
redisTemplate.delete("lock");
}
} else {
Thread.sleep(100);
redisLock();
}
}