【redis】redis分布式鎖(二)可重入鎖
前言
上一篇鏈接: 【redis】redis分布式鎖(一)手寫分布式鎖1.0~6.0
一、可重入鎖(又名遞歸鎖)
1、說明:
2、分開解釋:
3、可重入鎖的種類
隱式鎖(即synchronized關(guān)鍵字使用的鎖)默認(rèn)是可重入鎖
synchronized的重入實現(xiàn)機理
顯式鎖也有ReentrantLock這樣的可重入鎖
結(jié)論:
二、lock/unlock配合可重入鎖進行AQS源碼分析講解
三、思考,上述可重入鎖計數(shù)問題,redis哪個數(shù)據(jù)類型可以替代?
1、涉及到可重入鎖,原來redis中string類型就無法滿足要求,因為沒法記錄加鎖幾次,也就沒法解鎖
2、需要用到hash類型作為可重入鎖:
3、案例命令:
4、小總結(jié) 太帥了!
四、思考+設(shè)計重點(一橫一縱)
五、lua腳本
1、redis命令過程分析:
2、加鎖lua腳本lock
下邊將使用lua腳本的方式,把可重入鎖的案例語句原子化
V1.0版本
藍色部分是重復(fù)的,可以合并
V2.0版本
redis中,hincrby是具有hset的功能的,所以可以將條件合并
V3.0版本
換成對應(yīng)的參數(shù)
在redis中測試
3、解鎖lua腳本unlock
設(shè)計思路:先確定這個鎖是不是自己的 再去解鎖 最后刪除鎖
V1.0 V2.0加參數(shù)
測試
六、將上述lua腳本整合進入Java程序
對外不再暴露加解鎖的代碼,直接封裝成可執(zhí)行方法
1、v6.0不滿足可重入性,需要重新修改為v7.0
需要將加解鎖剝離出來, 封裝成可執(zhí)行方法
2、初始版本
3、新建RedisDistributedLock類并實現(xiàn)JUC里的Lock接口
4、滿足JUC里的AQS對lock鎖的接口規(guī)范定義來進行實現(xiàn)落地代碼
5、結(jié)合設(shè)計模式開發(fā)屬于自己的redis分布式鎖工具類
a、在tryLock里實現(xiàn)結(jié)合lua腳本的加鎖
b、unlock
c、v7.0調(diào)用鎖
6、工廠模式引入
v7.0版本問題說明
引入工廠模式v7.1代碼 將分為工廠類、redis分布式鎖、業(yè)務(wù)類三個講解
工廠類 相當(dāng)于spring里在controller里的注入的service
redis分布式鎖 基本不變,但是在業(yè)務(wù)類中不再是直接調(diào)用,而是通過工廠類來間接調(diào)用
業(yè)務(wù)類,通過spring的注入工廠類,再調(diào)用對應(yīng)分布式鎖
七、測試可重入性
1、代碼
2、結(jié)果 有錯誤 原因是兩次進入鎖時,生成的uuid不一致
3、腦圖
文章來源:http://www.zghlxwxcb.cn/news/detail-435718.html
4、解決
原因:是因為在設(shè)計redis鎖時,每次調(diào)用都會new一個uuid。
解決方法
:在工廠類直接new,這樣保證了同一次調(diào)用使用的一個uuid
文章來源地址http://www.zghlxwxcb.cn/news/detail-435718.html
到了這里,關(guān)于【redis】redis分布式鎖(二)可重入鎖+設(shè)計模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!