分散式鎖

千千菌發表於2024-10-30

MySQL分散式鎖

利用MySQL的特性:主鍵或者唯一索引值是唯一的。

Redis分散式鎖

原理

使用setnx key value,setnx = set if not exists,也就是隻有當key不存在時才set,key存在時不做任何操作。

獲取鎖:setnx key value
釋放鎖:del key

死鎖

死鎖舉例:一個程式獲取鎖後,在執行業務邏輯的時候掛掉了,沒有釋放鎖。其他程式就無法再獲取該鎖,會造成死鎖。

死鎖解決辦法:設定key的過期時間 setnx key value ttl,value是請求的唯一標識

設定過期時間導致的問題:程式還沒有執行完,鎖過期了。這時就會有其他程式獲取到鎖,刪除鎖的時候也可能會刪除其他程式的鎖。

設定過期時間導致的問題的解決辦法:

  1. 應用程式每隔半分鐘使用自己的 watch dog 監測當前 key 的 value,如果仍然是自己,TTL再續一分鐘;
  2. 應用程式在刪除鎖的時候,需要比較 value 的值是否和自己設定的相同

效能提升

使用分段鎖,將資源分段

叢集的問題

主從同步有延時,程式訪問不同主機,會有問題。

解決方案:紅鎖
伺服器之間不同步資料,伺服器數量為奇數,應用程式需要在超過一半的機器上加鎖成功。

參考文獻

分散式鎖影片教程

相關文章