基於註解的分布式redis鎖
分布式系統開發中常常用到分布式鎖,比如防止多個使用者同時預訂同乙個商品,傳統的synchronized
就無法實現了,而基於資料庫的樂觀鎖實現又可能會對資料庫產生較大的壓力。而分布式鎖相對較輕量,對效能影響也較小。目前主流的分布式鎖都基於redis實現。使用分布式鎖的流程一般如下:
如果需要使用分布式鎖的地方有多個,那麼就需要寫多個類似的**。而重複**是開發中最常見到的bad smell。我們可以使用aop把這段邏輯抽象出來,這樣就避免了重複**,也極大地減去了工作量。
使用註解(假設註解為@lock
)宣告要使用分布式鎖的業務method
、要鎖定的物件(一般是業務主鍵)、失效時間等資訊。在這裡插入**片
使用spring aoparround
(環繞通知)增強被@lock
註解的方法,把前面提到的」使用分布式鎖的流程「邏輯抽象到切面中。
使用redis實現分布式鎖。一般是基於string型別的set
命令實現。
如何根據請求的不同,鎖定不同的物件?
可以使用spring el表示式指定鎖定物件,加鎖時根據業務方法引數值、引數名稱解析表示式,得出要加鎖的物件(redis string的key)。
分布式鎖該如何選擇?
使用時只需在業務方法上加乙個註解就可以了,使用靈活、開發效率高、侵入小、適用性強。業務方法只需專注於業務**,可讀性強,易維護。
pom
org.springframework.boot
spring-boot-starter-data-redis
org.springframework.boot
spring-boot-starter-integration
org.springframework.integration
spring-integration-redis
定義註解 lock
/**
* @author l'amour solitaire
* @description 用於標記redis鎖
* @date 2020/11/17 下午3:14
**/@target()
@retention(retentionpolicy.runtime)
@documented
public @inte***ce mlock
service
所有屬性都有預設值,可直接使用@mlock
/**
* @author l'amour solitaire
* @description todo
* @date 2020/12/14 上午8:33
**/@service
public class peopleservice
}
cotroller
import com.aeert.lock.service.lockservice;
import com.aeert.lock.utils.r;
import lombok.requiredargsconstructor;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.web.bind.annotation.restcontroller;
/** * @author l'amour solitaire
* @description 測試redis鎖
* @date 2020/11/17 上午9:27
**/@restcontroller
@requiredargsconstructor(onconstructor_ = @autowired)
public class testcontroller
public r test1(string param1, string param2, string param3)
}
下面兩個介面同時訪問時會被攔截:
redis資料儲存結構
至此已經可以很方便的實現我們的需求了!
原始碼以及**倉庫呼叫: 方法鎖
基於redis分布式鎖註解版
思路使用aop,實現起來比較簡單,直接上 了 註解類 retention retentionpolicy.runtime target elementtype.method inherited documented public inte ce redislock切面 aspect componen...
基於Redis實現分布式鎖
分布式鎖的基本功能 1.同一時刻只能存在乙個鎖 2.需要解決意外死鎖問題,也就是鎖能超時自動釋放 3.支援主動釋放鎖 分布式鎖解決什麼問題 多程序併發執行任務時,需要保證任務的有序性或者唯一性 準備 redis版本 2.6 redis是主從 sentinel模式 為了高可用 原理 redis2.6之...
基於Redis實現分布式鎖
之前專案中使用redis鎖實現秒殺等一些併發業務,在這裡整理一下基於redis實現分布式鎖的簡單入門例項,記錄一下,便於以後檢視 學習。springboot整合redisson分布式鎖 1 簡介 在分布式系統中存在併發場景,為了解決這一問題,基於redis鎖一定程度可以解決這一問題,但是也有缺點,如...