基礎知識
Redis提供了函數來支持分佈式鎖:
SETNX key value
當且僅當 key 不存在時才能設置成功。設置成功時,返回1;反之,返回0。
如果鎖設置失敗,說明已經有其他任務獲取了這把鎖,可以通過循環的方式不斷地嘗試獲取鎖。
問題解答
(1)如果獲得鎖的任務因爲不可抗力掛掉了,比如斷電停機,怎麼保證鎖能被釋放?
通過設置超時時間來解決這個問題。
(2)假設超時時間到了,但是獲得鎖的任務還沒執行完,應該怎麼辦?
編寫守護線程,不斷的檢測是否存在超時時間已經結束,但是任務還沒執行完的情況。如果條件滿足,那麼重置超時時間。
(3)如何避免大量鎖同時過期的情況(會導致Redis短時間內阻塞)?
將超時時間*隨機數代替固定的 值。
(4)會存在兩個任務同時獲得了鎖的情況嗎?怎麼處理?
會。假設任務一的超時時間剛到,任務二馬上獲得 了鎖,這時候就會導致兩個任務都獲得了鎖。解決方案當然是避免這種情況的發生,可以採用(2)的 方案+調大任務二嘗試獲取鎖的時間間隔。但是治標不治本,這個問題終究是無法完全避免的。