基於redis的分佈式鎖spring-boot starter組件,使得項目擁有分佈式鎖能力變得異常簡單,支持spring boot,和spirng mvc等spring相關項目node
pring boot項目接入redis
添加lock starter組件依賴spring
<dependency> <groupId>cn.keking</groupId> <artifactId>spring-boot-klock-starter</artifactId> <version>1.3-RELEASE</version> </dependency> 2.application.properties配置redis連接:spring.klock.address=127.0.0.1:6379
3.在須要加分佈式鎖的方法上,添加註解@Klock,如:mvc
支持鎖指定的業務key,如同一個方法ID入參相同的加鎖,其餘的放行。業務key的獲取支持Spel,具體使用方式以下app
spring mvc項目接入分佈式
其餘步驟和spring boot步驟同樣,只須要spring-xx.xml配置中添加KlockAutoConfiguration類掃描便可,如:ide
<context:component-scan base-package="org.springframework.boot.autoconfigure.klock.KlockAutoConfiguration"/>
配置參數說明spring-boot
spring.klock.address : redis連接地址 spring.klock.password : redis密碼 spring.klock.database : redis數據索引 spring.klock.waitTime : 獲取鎖最長阻塞時間(默認:60,單位:秒) spring.klock.leaseTime: 已獲取鎖後自動釋放時間(默認:60,單位:秒) spring.klock.cluster-server.node-addresses : redis集羣配置 如 127.0.0.1:7000,127.0.0.1:7001,127.0.0.1:7002 spring.klock.address 和 spring.klock.cluster-server.node-addresses 選其一便可
@Klock註解參數說明測試
@Klock能夠標註四個參數,做用分別以下 name:lock的name,對應redis的key值。默認爲:類名+方法名 lockType:鎖的類型,目前支持(可重入鎖,公平鎖,讀寫鎖)。默認爲:公平鎖 waitTime:獲取鎖最長等待時間。默認爲:60s。同時也可經過spring.klock.waitTime統一配置 leaseTime:得到鎖後,自動釋放鎖的時間。默認爲:60s。同時也可經過spring.klock.leaseTime統一配置 lockTimeoutStrategy: 加鎖超時的處理策略,可配置爲不作處理、快速失敗、阻塞等待的處理策略,默認策略爲不作處理 customLockTimeoutStrategy: 自定義加鎖超時的處理策略,需指定自定義處理的方法的方法名,並保持入參一致。 releaseTimeoutStrategy: 釋放鎖時,持有的鎖已超時的處理策略,可配置爲不作處理、快速失敗的處理策略,默認策略爲不作處理 customReleaseTimeoutStrategy: 自定義釋放鎖時,需指定自定義處理的方法的方法名,並保持入參一致。
由於基於redis實現分佈式鎖,若是使用不當,會在如下場景下遇到鎖超時的問題:spa
加鎖超時處理策略(LockTimeoutStrategy):
NO_OPERATION 不作處理,繼續執行業務邏輯
FAIL_FAST 快速失敗,會拋出KlockTimeoutException
KEEP_ACQUIRE 阻塞等待,一直阻塞,直到得到鎖,但在太多的嘗試後,會中止獲取鎖並報錯,此時頗有多是發生了死鎖。
自定義(customLockTimeoutStrategy) 需指定自定義處理的方法的方法名,並保持入參一致,指定自定義處理方法後,會覆蓋上述三種策略,且會攔截業務邏輯的運行。
釋放鎖時超時處理策略(ReleaseTimeoutStrategy):
NO_OPERATION 不作處理,繼續執行業務邏輯
FAIL_FAST 快速失敗,會拋出KlockTimeoutException
自定義(customReleaseTimeoutStrategy) 需指定自定義處理的方法的方法名,並保持入參一致,指定自定義處理方法後,會覆蓋上述兩種策略, 執行自定義處理方法時,業務邏輯已經執行完畢,會在方法返回前和throw異常前執行。
但願使用者清楚的意識到,若是沒有對加鎖超時進行有效的設置,那麼設置釋放鎖時超時處理策略是沒有意義的。
在測試模塊中已集成鎖超時策略的使用用例
工程test模塊下,爲分佈式鎖的測試模塊。能夠快速體驗分佈式鎖的效果。