- 資料來源
- 基於Redis資料庫實現分佈鎖
- 基於分佈式環境才有分佈鎖之問題
- 需要以原子操作
- 無法使用JVM級別的鎖
- 將併發進行串行化(多路復用)操作,缺點就是無法支持高併發
- 可使用ZK鎖以決定Redis主從資料庫的資料一致性
- 情境如下
- 庫存數量10
- 下單後庫存-1
- 使用jmeter壓測
- 單例模式 (僅一個tomcat處理)
- 演變1
- 邏輯 : 單純將庫存-1
- 缺點 : 扣減錯誤 , 單機環境也可使用 sychronize鎖解決 , 但分布式環境併發仍會扣減錯誤
- 演變2
- 邏輯 : 使用redis setnx() or incr() 決定線呈是否取得鎖=1 , 結束後還原=0
- 缺點 : 部分線程雖優先順序較高 , 但無法取得鎖 ,造成後續扣減無法完成
- 缺點 : 如果程式執行發生異常或web應用掛機 , 鎖無法取消
- 演變3
- 邏輯 : 將鎖設置超時時間
- 缺點 : 後面線程將前面線程的鎖解除
- 缺點 : 超時時間不好預估
- 演變4
- 邏輯 : 使用redission框架 , 設置後台子線程 , 監測主線程是否還在執行, 如果還在執行則延遲超時時間 , 其他線程沒有取得鎖則循環嘗試加鎖
- 缺點 : 自旋處理有其缺點及適用場景
- Redission框架
- 可立即使用在分布式鎖環境
- 悲觀鎖 : 僅有取得鎖的線程可持續加鎖 , 其他線程要取得鎖必須等待 , 有性能問題
- 實現方法