一. Redis實現分佈式鎖
-
加鎖
雖然可以使用setnx(key,1),當一個線程執行setnx返回1,說明key原本不存在,該線程成功得到了鎖;當一個線程執行setnx返回0,說明key已經存在,該線程搶鎖失敗。
但這樣就導致鎖就沒有過期時間,別的線程再也無法獲得鎖。
所以可以採用set(key,1,30,NX)
-
解鎖
雖然可以使用del(key)來解鎖,但會存在誤刪情況。即一個已獲得鎖的線程A在設定的有效時間內未執行完畢就自動釋放鎖,此時另外一個線程B得到了鎖,在線程A執行完任務,線程B還未執行完任務的情況下,執行del(key)時,刪除的是B線程的鎖,過可採用Lua腳本
來實現解鎖。 -
鎖超時
對於解鎖時提出的情況,可以讓獲得鎖的線程開啓一個守護線程,用expire指令
來增加即將過期但還未執行完畢的線程鎖的時間。