天天看點

Redis事務的應用業務場景分析分布式鎖死鎖解決

分布式鎖

業務場景

秒殺問題,如何防止最後一件商品不會被多人同時購買。

解決方案

  • 使用setnx 設定一個公共鎖。

利用setnx指令的傳回值特征,有值則傳回設定失敗,無值則傳回設定成功。

  • 對于傳回設定成功的,擁有控制權,進行下一步具體業務操作。
  • 對于傳回值設定失敗的,不具有控制權,排隊或者等待。

操作完畢之後,通過del鍵值對來釋放鎖。

死鎖解決

業務場景

依賴分布式鎖的機制,某個使用者擷取到鎖,之後沒來得及釋放就挂了,如果解決。

業務分析

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

解決方案

使用expir為鎖key添加時間限定,到時不釋放,就放棄鎖。

expire lock-key second
pexpire lock-key milliseconds
           

由于操作通常都是微秒或者毫秒級的, 是以該鎖定時間不宜設定過大,具體時間根據業務設定。

  • 例如持有鎖的操作最長執行時間127ms,最短執行時間7ms。
  • 測試百萬次最長執行時間對應指令的最大耗時,此時百萬次網絡延遲平均耗時。
  • 鎖時間設定推薦:最大耗時 * 1.2 + 平均網絡延遲 * 1.1