今天在練手項目中也是遇到了許多新的技術,其中我認為最深刻的還是Redisson分布式鎖,這里我就結合一下我項目中用到Redisson分布式鎖的代碼來講述一下Redisson分布式鎖,希望可以幫助大家更深刻地理解這項技術。
在之前的文章中我已經講過Redisson分布式鎖的概念,這次我就結合項目代碼深入講述
首先給出項目代碼:
(從第一個注解就能看出來好久不用,我連Aop面向切面編程都遺忘了😂)
首先,這個@MyLock注解是標記在需要加入分布式鎖的方法上面,當一個線程需要執行這個方法時會被注解攔截進入切面類執行tryLock方法。
在這個tryLock方法中首先會調用鎖工廠(lockFactory)創建鎖對象,根據lockType和name,鎖工廠可以找到你需要一個什么樣的鎖,從而生成一個RLock對象,而這里也是我認為的一個重難點,接下來的話要認真感受:這里的getLock方法中用lockHandlers通過locktype從鎖工廠(MyLockFactory)中得到了創建這一類型鎖的方式,再通過apply(name)方法傳入name參數從而創建了新的RLock對象,重中之重來了,這個RLock對象實際只是鎖的代理對象
而這個鎖的代理對象,知道自己的name,明確自己的type,也具備與Redis通信的能力,但是在此時的Redis中,并沒有我們業務類中要用到的鎖的鍵和值!!!
于是就有了第二步lock.tryLock(),這一步操作才是在連接Redis嘗試獲取業務類中需要的鎖
在這一步操作中,會根據name在Redis中查找是否存在鍵為name字段的數據,如果存在,則說明鎖被占用,當前線程會進入等待,如果不存在,則會創建一個鍵為name字段,值為Hash結構的數據,并返回true。
因為返回值為true,線程會進入try{}代碼塊中執行業務方法