1. 程式人生 > >基於AOP實現redis分散式鎖

基於AOP實現redis分散式鎖

如果你的系統是分散式叢集部署的,那麼傳統的synchorinzed或者jdk1.5提供的Lock都是依賴本地的jvm虛擬機器提供鎖服務,分散式服務中多jvm是無法同享鎖資訊的,故無法提供鎖。 分散式場景中資料一致性問題一直是一個比較重要的話題。分散式的CAP理論告訴我們任何一個分散式系統都無法同時滿足一致性(Consistency)、可用性(Availability)、分割槽容錯性(Partition tolerance),最多隻能同時滿足兩項。所以很多系統在設計之初就要對這三者作出取捨。在網際網路領域的絕大多數的場景中,都需要犧牲強一致性來換取系統的高可用性,系統往往只需要保證"最終一致性",只要對最終時間是在使用者可以接受的範圍內即可。使用redis實現分散式鎖SETNXSETNX key val 當且僅當key不存在時,set一個key為val的字串,返回1;若key存在,則什麼都不做,返回0。expireexpire key timeout 為key設定一個超時時間,單位為second,超過這個時間鎖會自動釋放,避免死鎖。deletedelete key 刪除key實現思路:1:獲取鎖的時候使用setnx命令設定唯一的key和expire設定鎖過期時間。2: 業務處理完畢之後使用delete命令刪除key。3: 如果業務處理中發生意外無法自動回收key資源,redis將通過expire命令之前設定鎖過期時間自動回收。使用AOP動態配置Spring的AOP能為我們提供動態的鎖獲取和鎖釋放,能大大降低工作量和程式碼的耦合性。1:定義切面


ps:方法使用cacheLock註解則能為該方法提供切面服務2:定義註解2.1:方法註解
lockedPrefix:key字首timeout:輪詢鎖時間expireTime:鎖過期時間2.2:引數註解引數註解定義需要鎖的key,LockedObject:定義一個鎖key、LockCopmlexObject:定一個複合物件的fiel作為鎖的key

3:鎖實現程式碼3.1獲取鎖
3.2 釋放鎖
4 鎖使用
流程說明:1:定義分散式鎖切面,當方法使用指定註解,aop注入程式碼邏輯2:獲取該方法中引數列表定義的鎖key3:判斷該key是否被使用中,如果是則輪詢,如果超過時間則丟擲異常,如果成功獲取鎖則執行自己方法程式碼