基於 Redis 分散式鎖

毅丶俊發表於2022-04-15

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();
  }
}

相關文章