如何在 SpringBoot 中用註解實現 Redis 分散式鎖?
阿新 • • 發佈:2021-01-08
一、業務背景
有些業務請求,屬於耗時操作,需要加鎖,防止後續的併發操作,同時對資料庫的資料進行操作,需要避免對之前的業務造成影響。
二、分析流程
使用 Redis
作為分散式鎖,將鎖的狀態放到 Redis
統一維護,解決叢集中單機 JVM
資訊不互通的問題,規定操作順序,保護使用者的資料正確。
梳理設計流程
- 新建註解 @interface,在註解裡設定入參標誌
- 增加 AOP 切點,掃描特定註解
- 建立 @Aspect 切面任務,註冊 bean 和攔截特定方法
- 特定方法引數 ProceedingJoinPoint,對方法 pjp.proceed() 前後進行攔截
- 切點前進行加鎖,任務執行後進行刪除 key
核心步驟:加鎖、解鎖和續時
加鎖
使用了 RedisTemplate 的 opsForValue.setIfAbsent 方法,判斷是否有 key,設定一個隨機數 UUID.random().toString,生成一個隨機數作為 value。
從 redis 中獲取鎖之後,對 key 設定 expire 失效時間,到期後自動釋放鎖。
按照這種設計,只有第一個成功設定 Key
的請求,才能進行後續的資料操作,後續其它請求由於無法獲得