1. 程式人生 > 資料庫 >如何在 SpringBoot 中用註解實現 Redis 分散式鎖?

如何在 SpringBoot 中用註解實現 Redis 分散式鎖?

一、業務背景

有些業務請求,屬於耗時操作,需要加鎖,防止後續的併發操作,同時對資料庫的資料進行操作,需要避免對之前的業務造成影響。

 

二、分析流程

使用 Redis 作為分散式鎖,將鎖的狀態放到 Redis 統一維護,解決叢集中單機 JVM 資訊不互通的問題,規定操作順序,保護使用者的資料正確。

梳理設計流程

  1. 新建註解 @interface,在註解裡設定入參標誌
  2. 增加 AOP 切點,掃描特定註解
  3. 建立 @Aspect 切面任務,註冊 bean 和攔截特定方法
  4. 特定方法引數 ProceedingJoinPoint,對方法 pjp.proceed() 前後進行攔截
  5. 切點前進行加鎖,任務執行後進行刪除 key

核心步驟:加鎖、解鎖和續時

加鎖

使用了 RedisTemplate 的 opsForValue.setIfAbsent 方法,判斷是否有 key,設定一個隨機數 UUID.random().toString,生成一個隨機數作為 value。

從 redis 中獲取鎖之後,對 key 設定 expire 失效時間,到期後自動釋放鎖。

按照這種設計,只有第一個成功設定 Key 的請求,才能進行後續的資料操作,後續其它請求由於無法獲得