分布式鎖
業務場景
秒殺問題,如何防止最後一件商品不會被多人同時購買。
解決方案
- 使用setnx 設定一個公共鎖。
利用setnx指令的傳回值特征,有值則傳回設定失敗,無值則傳回設定成功。
- 對于傳回設定成功的,擁有控制權,進行下一步具體業務操作。
- 對于傳回值設定失敗的,不具有控制權,排隊或者等待。
操作完畢之後,通過del鍵值對來釋放鎖。
死鎖解決
業務場景
依賴分布式鎖的機制,某個使用者擷取到鎖,之後沒來得及釋放就挂了,如果解決。
業務分析
- 由于鎖操作由使用者控制加鎖解鎖,必定會存在加鎖後未解鎖的風險。
- 需要解鎖操作不能僅依賴使用者控制,系統級别要給出對應的處理方案。
解決方案
使用expir為鎖key添加時間限定,到時不釋放,就放棄鎖。
expire lock-key second
pexpire lock-key milliseconds
由于操作通常都是微秒或者毫秒級的, 是以該鎖定時間不宜設定過大,具體時間根據業務設定。
- 例如持有鎖的操作最長執行時間127ms,最短執行時間7ms。
- 測試百萬次最長執行時間對應指令的最大耗時,此時百萬次網絡延遲平均耗時。
- 鎖時間設定推薦:最大耗時 * 1.2 + 平均網絡延遲 * 1.1