吊打面試官之幂等性問題
-
- 1、什麼是幂等性問題?
- 2、有哪些幂等性問題解決方案?
- 3、為什麼選擇分布式鎖解決幂等性問題方案?
-
- 3.1、悲觀鎖
- 3.2、樂觀鎖
- 3.3、分布式鎖
- 4、我是如何使用分布式鎖解決幂等性問題?
- 5、往期佳文
-
- 5.1、面試系列
- 5.2、技術系列
1、什麼是幂等性問題?
我認為就是在同一個操作中不論執行多少次請求産生的效果和傳回的效果都是一樣的。
場景: 隻要更新資料是依賴讀取的資料作為基礎條件的,當遇到高并發的時候,就可能會出現幂等性問題;(賣票,充值等場景)
解決方案: 在該操作上加鎖,隻允許一個人操作成功。
2、有哪些幂等性問題解決方案?
1. 悲觀鎖
2. 樂觀鎖
3. 分布式鎖(推薦)
3、為什麼選擇分布式鎖解決幂等性問題方案?
3.1、悲觀鎖
解釋: 顧名思義,就是很悲觀,每次去拿資料的時候都認為别人會修改,是以每次在拿資料的時候都會上鎖,這樣别人想拿這個資料就會block直到它拿到鎖。
優點:
1、實作簡單
缺點:
1、資料鎖定時間可能會很長,影響使用者體驗和系統吞吐量
3.2、樂觀鎖
解釋: 顧名思義,就是很樂觀,每次去拿資料的時候都認為别人不會修改,是以不會上鎖,但是在送出更新的時候會判斷一下在此期間别人有沒有去更新這個資料。
優點:
1、運用廣泛
2、不影響系統性能
缺點:
1、對代碼具有入侵性
樂觀鎖連結:吊打面試官之樂觀鎖
3.3、分布式鎖
解釋: 就是程序A和程序B發送短信前先去注冊一個鎖,假設程序A搶到了鎖,程序B就等待結果,如果發送成功了,那麼B就放棄此次任務,等待下一個小時
優點:
1、基于分布式系統
2、使用廣泛
3、擴充性高
缺點:
1、實作複雜
樂觀鎖連結:吊打面試官之分布式鎖
4、我是如何使用分布式鎖解決幂等性問題?
(1)擷取鎖的時候,使用setnx加鎖,并使用expire指令為鎖添加一個逾時時間,超過該時間則自動釋放鎖,鎖的value值為一個随機生成的UUID(或者業務Id),通過此在釋放鎖的時候進行判斷。
(2)擷取鎖的時候還設定一個擷取的逾時時間,若超過這個時間則放棄擷取鎖。
(3)釋放鎖的時候,通過UUID(或者業務Id)判斷是不是該鎖,若是該鎖,則執行delete進行鎖釋放。
代碼下載下傳位址: 源碼位址
5、往期佳文
5.1、面試系列
1、吊打面試官之一面自我介紹
2、吊打面試官之一面項目介紹
······持續更新中······
5.2、技術系列
1、吊打面試官之分布式會話
2、吊打面試官之分布式鎖
3、吊打面試官之樂觀鎖
······持續更新中······