本篇文章給大家分享的是有關(guān)redis中分布式鎖如何解決鎖超時問題,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
創(chuàng)新互聯(lián)是一家專業(yè)提供海門企業(yè)網(wǎng)站建設(shè),專注與成都做網(wǎng)站、網(wǎng)站建設(shè)、H5網(wǎng)站設(shè)計、小程序制作等業(yè)務(wù)。10年已為海門眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進行中。
關(guān)于redis分布式鎖, 查了很多資料, 發(fā)現(xiàn)很多只是實現(xiàn)了最基礎(chǔ)的功能, 但是, 并沒有解決當鎖已超時而業(yè)務(wù)邏輯還未執(zhí)行完的問題, 這樣會導(dǎo)致: A線程超時時間設(shè)為10s(為了解決死鎖問題), 但代碼執(zhí)行時間可能需要30s, 然后redis服務(wù)端10s后將鎖刪除, 此時, B線程恰好申請鎖, redis服務(wù)端不存在該鎖, 可以申請, 也執(zhí)行了代碼, 那么問題來了, A、B線程都同時獲取到鎖并執(zhí)行業(yè)務(wù)邏輯, 這與分布式鎖最基本的性質(zhì)相違背: 在任意一個時刻, 只有一個客戶端持有鎖, 即獨享
二、準備工作
壓測工具jmeter
https://pan.baidu.com/share/init?surl=NN0c0tDYQjBTTPA-WTT3yg提取碼: 8f2a
redis-desktop-manager客戶端
https://pan.baidu.com/share/init?surl=NoJtZZZOXsk45aQYtveWbQ提取碼: 9bhf
postman
https://pan.baidu.com/share/init?surl=28sGJk4zxoOknAd-47hE7w提取碼: vfu7
也可以直接官網(wǎng)下載, 我這邊都整理到網(wǎng)盤了
需要postman是因為我還沒找到j(luò)meter多開窗口的辦法, 哈哈
1、springmvc項目
2、maven依賴
3、核心類
分布式鎖工具類: DistributedLock
測試接口類: PcInformationServiceImpl
鎖延時守護線程類: PostponeTask
先測試在不開啟鎖延時線程的情況下, A線程超時時間設(shè)為10s, 執(zhí)行業(yè)務(wù)邏輯時間設(shè)為30s, 10s后, 調(diào)用接口, 查看是否能夠獲取到鎖, 如果獲取到, 說明存在線程安全性問題
同上, 在加鎖的同時, 開啟鎖延時線程, 調(diào)用接口, 查看是否能夠獲取到鎖, 如果獲取不到, 說明延時成功, 安全性問題解決
說明: 就2個方法, 加鎖解鎖, 加鎖使用jedis setnx方法, 解鎖執(zhí)行l(wèi)ua腳本, 都是原子性操作
說明: 測試類很簡單, value隨機生成, 保證唯一, 不會在超時情況下解鎖其他客戶端持有的鎖
設(shè)置5個線程同時訪問, 在10s的超時時間內(nèi)查看redis, add_information_lock存在, 多次調(diào)接口, 只有一個線程能夠獲取到鎖
往期100篇回顧:一百期面試題匯總
redis
1-4個請求, 都未獲取到鎖
第5個請求, 獲取到鎖
OK, 目前為止, 一切正常, 接下來測試10s之后, A仍在執(zhí)行業(yè)務(wù)邏輯, 看別的線程是否能獲取到鎖
可以看到, 操作成功, 說明A和B同時執(zhí)行了這段本應(yīng)該獨享的代碼, 需要優(yōu)化。
往期100篇回顧:一百期面試題匯總
說明: 新增了鎖延時方法, lua腳本, 自行腦補相關(guān)語法
說明: 調(diào)用lock同時, 立即開啟PostponeTask線程, 線程等待超時時間的2/3時間后, 開始執(zhí)行鎖延時代碼, 如果延時成功, add_information_lock這個key會一直存在于redis服務(wù)端, 直到業(yè)務(wù)邏輯執(zhí)行完畢, 因此在此過程中, 其他線程無法獲取到鎖, 也即保證了線程安全性
下面是測試結(jié)果
10s后, 查看redis服務(wù)端, add_information_lock仍存在, 說明延時成功
此時用postman再次請求, 發(fā)現(xiàn)獲取不到鎖
看一下控制臺打印
A線程在19:09:11獲取到鎖, 在10 * 2 / 3 = 6s后進行延時, 成功, 保證了業(yè)務(wù)邏輯未執(zhí)行完畢的情況下不會釋放鎖
A線程執(zhí)行完畢, 鎖釋放, 其他線程又可以競爭鎖
OK, 目前為止, 解決了鎖超時而業(yè)務(wù)邏輯仍在執(zhí)行的鎖沖突問題, 還很簡陋, 而最嚴謹?shù)姆绞竭€是使用官方的 Redlock 算法實現(xiàn), 其中 Java 包推薦使用 redisson, 思路差不多其實, 都是在快要超時時續(xù)期, 以保證業(yè)務(wù)邏輯未執(zhí)行完畢不會有其他客戶端持有鎖
以上就是Redis中分布式鎖如何解決鎖超時問題,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。