深入Redis分佈式鎖

基礎知識

Redis提供了函數來支持分佈式鎖:

        SETNX key value

當且僅當 key 不存在時才能設置成功。設置成功時,返回1;反之,返回0。

如果鎖設置失敗,說明已經有其他任務獲取了這把鎖,可以通過循環的方式不斷地嘗試獲取鎖。

問題解答

(1)如果獲得鎖的任務因爲不可抗力掛掉了,比如斷電停機,怎麼保證鎖能被釋放?

         通過設置超時時間來解決這個問題。

(2)假設超時時間到了,但是獲得鎖的任務還沒執行完,應該怎麼辦?

       編寫守護線程,不斷的檢測是否存在超時時間已經結束,但是任務還沒執行完的情況。如果條件滿足,那麼重置超時時間。

(3)如何避免大量鎖同時過期的情況(會導致Redis短時間內阻塞)?

       將超時時間*隨機數代替固定的 值。

(4)會存在兩個任務同時獲得了鎖的情況嗎?怎麼處理?

      會。假設任務一的超時時間剛到,任務二馬上獲得 了鎖,這時候就會導致兩個任務都獲得了鎖。解決方案當然是避免這種情況的發生,可以採用(2)的 方案+調大任務二嘗試獲取鎖的時間間隔。但是治標不治本,這個問題終究是無法完全避免的。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章