分佈式鎖(Redis實現、Zookeeper實現)

一. Redis實現分佈式鎖

  1. 加鎖
    雖然可以使用setnx(key,1),當一個線程執行setnx返回1,說明key原本不存在,該線程成功得到了鎖;當一個線程執行setnx返回0,說明key已經存在,該線程搶鎖失敗。
    但這樣就導致鎖就沒有過期時間,別的線程再也無法獲得鎖。
    所以可以採用set(key,1,30,NX)

  2. 解鎖
    雖然可以使用del(key)來解鎖,但會存在誤刪情況。即一個已獲得鎖的線程A在設定的有效時間內未執行完畢就自動釋放鎖,此時另外一個線程B得到了鎖,在線程A執行完任務,線程B還未執行完任務的情況下,執行del(key)時,刪除的是B線程的鎖,過可採用Lua腳本來實現解鎖。

  3. 鎖超時
    對於解鎖時提出的情況,可以讓獲得鎖的線程開啓一個守護線程,用expire指令來增加即將過期但還未執行完畢的線程鎖的時間。

二. Zk(Zookeeper)實現分佈式鎖

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