redis-19.事務-鎖

aliyeye發表於2021-02-25

監視鎖

業務場景

天貓雙11熱賣過程中,對已經售罄的貨物追加補貨,4個業務員都有許可權進行補貨。補貨的操作可能是一系列的操作,牽扯到多個連續操作,如何保障不會重複操作?

業務分析

  • 多個客戶端有可能同時操作同一組資料,並且該資料一旦被操作修改後,將不適用於繼續操作
  • 在操作之前鎖定要操作的資料,一旦發生變化,終止當前操作

解決方案

  • 對key新增監視鎖,在執行exec前如果key發生了變化,終止事務執行

    watch key1  [key2.....]
  • 取消對所有可以的監視

    unwatch

分散式鎖

業務場景

天貓雙11熱賣過程中,對已經售罄的貨物追加補貨,且補貨完成。客戶購買熱情高漲,幾秒內將所有商品購買完畢。本次補貨已經將庫存全部清空,如何避免最後一件商品不被多人同時購買。(超賣現象)

業務分析

  • 使用watch監控一個key有沒有改變已經不能解決問題,此處要監控的是具體資料
  • 雖然redis是單執行緒的,但是多個客戶端對同一資料同時進行操作時,如何避免不同時修改?

解決方案

  • 使用setnx設定一個公共鎖
    setnx lock-key value
    利用setnx命令的返回值特徵,有值則返回設定失敗,無值則返回設定成功
    • 對於返回設定成功的,擁有控制權,進行下一步的具體業務操作
    • 對於返回設定失敗的,不具有控制權,排隊或等待
    • 操作完畢透過del操作釋放鎖

注意:上述解決方案是一種設計概念,依賴規範保障,具有風險性

業務場景

依賴分散式鎖的機制,某個使用者操作時對應客戶端當機,且此時已經獲取到鎖。如何解決?

業務分析

  • 由於鎖操作由使用者控制加鎖解鎖,必定會存在加鎖後未解鎖的風險
  • 需要解鎖操作不能僅依賴使用者控制,系統級別要給出對應的保底處理方案

解決方案

  • 使用expire為鎖key新增時間限定,到時不釋放,放棄鎖
    expire lock-key second
    pexpire lock-key milliseconds
    由於操作通常都是微秒和毫秒級,因此該鎖定時間不宜設定過大。具體時間需要業務測試後確認。
    • 例如:持有鎖的操作最長執行時間127ms,最短執行時間7ms
    • 測試百萬次最長執行時間對應命令的最大耗時,測試百萬網路延遲平均耗時
    • 鎖時間設定推薦:最大耗時120%+平均網路延遲110%
    • 如果業務最大耗時<<網路平均延遲,通常為2個數量級,取其中單個耗時較長即可
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章