91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Redis中分布式鎖如何解決鎖超時問題

發布時間:2021-07-29 17:38:19 來源:億速云 閱讀:444 作者:Leah 欄目:大數據

本篇文章給大家分享的是有關Redis中分布式鎖如何解決鎖超時問題,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

一、前言

關于redis分布式鎖, 查了很多資料, 發現很多只是實現了最基礎的功能, 但是, 并沒有解決當鎖已超時而業務邏輯還未執行完的問題, 這樣會導致: A線程超時時間設為10s(為了解決死鎖問題), 但代碼執行時間可能需要30s, 然后redis服務端10s后將鎖刪除, 此時, B線程恰好申請鎖, redis服務端不存在該鎖, 可以申請, 也執行了代碼, 那么問題來了, A、B線程都同時獲取到鎖并執行業務邏輯, 這與分布式鎖最基本的性質相違背: 在任意一個時刻, 只有一個客戶端持有鎖, 即獨享

二、準備工作

壓測工具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

也可以直接官網下載, 我這邊都整理到網盤了

需要postman是因為我還沒找到jmeter多開窗口的辦法, 哈哈

三、說明

1、springmvc項目

2、maven依賴

Redis中分布式鎖如何解決鎖超時問題

3、核心類

  • 分布式鎖工具類: DistributedLock

  • 測試接口類: PcInformationServiceImpl

  • 鎖延時守護線程類: PostponeTask

四、實現思路

先測試在不開啟鎖延時線程的情況下, A線程超時時間設為10s, 執行業務邏輯時間設為30s, 10s后, 調用接口, 查看是否能夠獲取到鎖, 如果獲取到, 說明存在線程安全性問題

同上, 在加鎖的同時, 開啟鎖延時線程, 調用接口, 查看是否能夠獲取到鎖, 如果獲取不到, 說明延時成功, 安全性問題解決

五、實現

1、版本01代碼

1)、DistributedLock

Redis中分布式鎖如何解決鎖超時問題

Redis中分布式鎖如何解決鎖超時問題

說明: 就2個方法, 加鎖解鎖, 加鎖使用jedis setnx方法, 解鎖執行lua腳本, 都是原子性操作

2)、PcInformationServiceImpl

Redis中分布式鎖如何解決鎖超時問題

說明: 測試類很簡單, value隨機生成, 保證唯一, 不會在超時情況下解鎖其他客戶端持有的鎖

3)、打開redis-desktop-manager客戶端, 刷新緩存, 可以看到, 此時是沒有add_information_lock的key的

Redis中分布式鎖如何解決鎖超時問題

4)、啟動jmeter, 調用接口測試

設置5個線程同時訪問, 在10s的超時時間內查看redis, add_information_lock存在, 多次調接口, 只有一個線程能夠獲取到鎖

往期100篇回顧:一百期面試題匯總

redis

Redis中分布式鎖如何解決鎖超時問題

1-4個請求, 都未獲取到鎖

Redis中分布式鎖如何解決鎖超時問題

第5個請求, 獲取到鎖

Redis中分布式鎖如何解決鎖超時問題

OK, 目前為止, 一切正常, 接下來測試10s之后, A仍在執行業務邏輯, 看別的線程是否能獲取到鎖

Redis中分布式鎖如何解決鎖超時問題

可以看到, 操作成功, 說明A和B同時執行了這段本應該獨享的代碼, 需要優化。

往期100篇回顧:一百期面試題匯總

2、版本02代碼

1)、DistributedLock

Redis中分布式鎖如何解決鎖超時問題

Redis中分布式鎖如何解決鎖超時問題

Redis中分布式鎖如何解決鎖超時問題

說明: 新增了鎖延時方法, lua腳本, 自行腦補相關語法

2)、PcInformationServiceImpl不需要改動

3)、PostponeTask

Redis中分布式鎖如何解決鎖超時問題

Redis中分布式鎖如何解決鎖超時問題

說明: 調用lock同時, 立即開啟PostponeTask線程, 線程等待超時時間的2/3時間后, 開始執行鎖延時代碼, 如果延時成功, add_information_lock這個key會一直存在于redis服務端, 直到業務邏輯執行完畢, 因此在此過程中, 其他線程無法獲取到鎖, 也即保證了線程安全性

下面是測試結果

10s后, 查看redis服務端, add_information_lock仍存在, 說明延時成功

Redis中分布式鎖如何解決鎖超時問題

此時用postman再次請求, 發現獲取不到鎖

Redis中分布式鎖如何解決鎖超時問題

看一下控制臺打印

Redis中分布式鎖如何解決鎖超時問題

Redis中分布式鎖如何解決鎖超時問題

A線程在19:09:11獲取到鎖, 在10 * 2 / 3 = 6s后進行延時, 成功, 保證了業務邏輯未執行完畢的情況下不會釋放鎖

A線程執行完畢, 鎖釋放, 其他線程又可以競爭鎖

OK, 目前為止, 解決了鎖超時而業務邏輯仍在執行的鎖沖突問題, 還很簡陋, 而最嚴謹的方式還是使用官方的 Redlock 算法實現, 其中 Java 包推薦使用 redisson, 思路差不多其實, 都是在快要超時時續期, 以保證業務邏輯未執行完畢不會有其他客戶端持有鎖

以上就是Redis中分布式鎖如何解決鎖超時問題,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

塔城市| 龙井市| 湄潭县| 潍坊市| 扶绥县| 沅江市| 衢州市| 太仆寺旗| 高清| 城固县| 繁昌县| 五原县| 贡嘎县| 博爱县| 温泉县| 苏尼特右旗| 营口市| 临湘市| 志丹县| 兴海县| 罗源县| 得荣县| 鄂尔多斯市| 大化| 仁怀市| 南溪县| 石阡县| 监利县| 全州县| 蕲春县| 上思县| 民县| 株洲市| 海宁市| 调兵山市| 东丰县| 邯郸县| 汨罗市| 邵阳县| 甘孜县| 肇东市|