2020/1/31

Redis資料庫+分佈鎖 - 基於Redis資料庫實現分佈鎖(二)

  • 資料來源
  • 基於Redis資料庫實現分佈鎖
    • 基於分佈式環境才有分佈鎖之問題
    • 需要以原子操作
    • 無法使用JVM級別的鎖
    • 將併發進行串行化(多路復用)操作,缺點就是無法支持高併發
    • 可使用ZK鎖以決定Redis主從資料庫的資料一致性
  • 情境如下
    • 庫存數量10
    • 下單後庫存-1
    • 使用jmeter壓測
    • 單例模式 (僅一個tomcat處理)
  • 演變1
    • 邏輯 : 單純將庫存-1
    • 缺點 : 扣減錯誤 , 單機環境也可使用 sychronize鎖解決 , 但分布式環境併發仍會扣減錯誤

  • 演變2
    • 邏輯 : 使用redis setnx() or incr() 決定線呈是否取得鎖=1 , 結束後還原=0
    • 缺點 : 部分線程雖優先順序較高 , 但無法取得鎖 ,造成後續扣減無法完成
    • 缺點 : 如果程式執行發生異常或web應用掛機 , 鎖無法取消

  • 演變3
    • 邏輯 : 將鎖設置超時時間
    • 缺點 : 後面線程將前面線程的鎖解除
    • 缺點 : 超時時間不好預估

  • 演變4
    • 邏輯 : 使用redission框架 ,  設置後台子線程 , 監測主線程是否還在執行, 如果還在執行則延遲超時時間 , 其他線程沒有取得鎖則循環嘗試加鎖
    • 缺點 : 自旋處理有其缺點及適用場景


  • Redission框架
    • 可立即使用在分布式鎖環境
    • 悲觀鎖 : 僅有取得鎖的線程可持續加鎖 , 其他線程要取得鎖必須等待 , 有性能問題
    • 實現方法


沒有留言:

張貼留言

test2