網站首頁 編程語言 正文
分布式鎖應用場景
秒殺環境下:訂單服務從庫存中心拿到庫存數,如果庫存總數大于0,則進行庫存扣減,并創建訂單
訂單服務負責創建訂單
庫存服務負責扣減庫存
模擬用戶訪問庫存
多線程并發訪問,出現超賣問題,線程不安全。沒有保證原子性
單體鎖的分類
單體應用鎖指的是只能在 一個JVM 進程內有效的鎖。我們把這種鎖叫做單體應用鎖
synchronized鎖ReentrantLock鎖
一個 Tomcat 可以看作是一個JVM進程,當大量請求并發到系統時,所有的請求都落在這唯一的一個Tomcat上,如果某些請求方法是需要加鎖的,比如:秒殺扣減庫存,是可以滿足需求的,但是隨著訪問量的增加,導致一個tomcat 難以支撐,這時我們必然就是集群部署Tomcat ,使用多個 Tomcat 共同支撐整個系統。
我們看到系統中存在兩個Tomcat,我們加的鎖是JDK提供的鎖,這種鎖只能在 一個JVM 下起到作用,也就是在一個Tomcat內是沒有問題的。當存在兩個或兩個以上的Tomcat時,大量的并發請求分散到不同的Tomcat上,在每一個Tomcat中都可以防止并發的產生,但是在多個Tomcat之間,每個Tomcat中獲得鎖的這個請求,又產生了并發,從而產生超賣現象。這也就是單體應用鎖的局限性了,它只能在一個JVM內加鎖,所以單體鎖只能鎖住單體環境,是鎖不住分布式環境或集群環境的。
分布式鎖核心邏輯
分布式鎖的核心邏輯就是在多個服務中設置一個公共的資源,在公共資源中設置鎖,供多個服務去同時搶奪鎖資源,一旦其中一個線程搶奪成功,其他線程就進入自旋狀態,不同的嘗試訪問獲取鎖資源,在獲取鎖資源的線程執行完相應的邏輯以后就會釋放鎖資源,其他線程就可以獲取鎖資源。
分布式鎖實現的問題——死鎖和解決
死鎖:
如果某個線程在執行鎖邏輯過程中宕機,導致沒有刪除鎖
解決:
添加過期時間
因為是非原子性添加過期時間,可能導致在添加過期時間之前就出現宕機現象,此時依舊進入死鎖狀態。原子性添加過期時間
Redis解決刪除別人鎖的問題
刪除別人鎖:
當有線程A進入后由于超時,有其他線程B進入,此時redis中的鎖是線程B的,而原來的線程A接著執行,線程A刪除了別人的鎖。
刪除別人鎖解決:
①給當前線程綁定一個局部變量uuid,由于每個線程都有一份自己的局部變量,那么線程和局部變量綁定之后,我們在刪除鎖之前判斷一下,當前這把鎖是不是自己的載進行刪除
②使用lua表達式進一步解決
上述方案還是存在問題,在線程A自己的uuid剛好與redis的uuid比較完,正準備刪除的時候過期,這時候B線程進入,此時的redisuuid就不是線程A的了,此時還是會存在刪除別人鎖的問題。
這是由于在拿鎖、比較鎖和刪除鎖的過程中并不是原子性的操作。解決此問題可以使用lua表達式
原文鏈接:https://blog.csdn.net/xiaowanziddd/article/details/125583692
相關推薦
- 2023-06-03 Python+Requests+PyTest+Excel+Allure?接口自動化測試實戰_pyth
- 2022-09-24 Go?GORM?事務詳細介紹_Golang
- 2022-06-16 docker?maven?plugin快速部署微服務的詳細流程_docker
- 2022-06-16 Python數據結構之遞歸可視化詳解_python
- 2022-05-07 MVC中Action方法的返回類型介紹_基礎應用
- 2022-02-04 UMP系統設計了如下機制來保證數據安全
- 2022-04-04 react解包并配置Less解包config文件目錄
- 2022-09-18 面試必問Linux?命令su和sudo的區別解析_linux shell
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支