基于分布式系統(tǒng),Java提供的內(nèi)置鎖(synchronized和AQS Lock)無法滿足在分布式環(huán)境下保證線程的原子性一致性持久性
使用Redis Spring數(shù)據(jù)結(jié)構(gòu)基于原子性的設(shè)計可以實現(xiàn)其分布式鎖
其思路為:
第一步
通過RedisTemplate接口向Redis中新增我們的鎖數(shù)據(jù)(參數(shù):鎖名,線程ID,超時自動過期時間,單位)
第二步
判斷該線程是否是新增鎖數(shù)據(jù)的線程(判斷redis中是否存有鎖名的數(shù)據(jù)),即判斷該線程是否拿到鎖,如果是就執(zhí)行業(yè)務(wù)邏輯,如果沒有拿到鎖那么處于等待狀態(tài),直到該鎖被釋放
第三步
程序執(zhí)行完成,執(zhí)行釋放鎖的代碼(delete),允許其他線程爭搶拿鎖執(zhí)行
說明:
應(yīng)保證添加鎖數(shù)據(jù)時原子性
應(yīng)保證是對應(yīng)的線程釋放對應(yīng)的鎖(加入線程ID參數(shù)的原因,防止出現(xiàn)鎖失效)
鎖的自動失效時間不易過長也不易過短
簡單代碼如下:
問題:
無法保證線程在鎖失效時間前執(zhí)行完畢 會出現(xiàn)bug
解決方案:鎖續(xù)命
比較成熟的鎖框架推薦
redisson
基于redis 原子性 即lua腳本實現(xiàn)