1、數據庫的唯一索引實現
獲得鎖時向表中插入一條記錄,釋放鎖時刪除這條記錄。唯一索引可以保證該記錄只被插入一次,那麼就可以用這個記錄是否存在來判斷是否存於鎖定狀態。
缺點:
-
鎖沒有失效時間,解鎖失敗的話其它進程無法再獲得該鎖。
-
只能是非阻塞鎖,插入失敗直接就報錯了,無法重試。
-
不可重入,已經獲得鎖的進程也必須重新獲取鎖。
2、Redis的SETNX指令實現
使用 SETNX(set if not exist)指令插入一個鍵值對,如果 Key 已經存在,那麼會返回 False,否則插入成功並返回 True。
SETNX 指令和數據庫的唯一索引類似,保證了只存在一個 Key 的鍵值對,那麼可以用一個 Key 的鍵值對是否存在來判斷是否存於鎖定狀態。
EXPIRE 指令可以爲一個鍵值對設置一個過期時間,從而避免了數據庫唯一索引實現方式中釋放鎖失敗的問題。
3、Zookeeper的有序節點實現