十九、Redis分散式鎖、Zookeeper分散式鎖

Hro發表於2019-01-02

一、Redis分散式鎖
   1、執行緒呼叫setnx(lockkey,currentTime+timeout),設定成功,也就是返回true,給這個key設定有效期;
  2、設定成功,呼叫expire(lockkey,timeout),設定鎖的過期時間,執行業務,然後呼叫del(lockkey),釋放鎖。
  3、設定失敗,表示當前鎖正在使用,則呼叫get(lockkey) 得到valueA;
  4、如果valueA!=null && currentTime (當前時間毫秒數)>valueA,表示超時,執行5;
  5、超時時,呼叫getset(lockkey,currentTime+timeout) 得到valueB,如果valueB ==null || valueA == valueB,獲得鎖操作步驟6,否則說明鎖被其他執行緒獲取了;
  6、處理完業務邏輯,再去判斷鎖是否超時,如果沒超時刪除鎖,如果已超時,不用處理。
流程如圖:

十九、Redis分散式鎖、Zookeeper分散式鎖
二、Zookeeper分散式鎖
  1、客戶端對某個方法加鎖時,在zk上的與該方法對應的指定locker節點的目錄下,生成一個唯一的瞬時有序節點node1;
   2、客戶端獲取該路徑下所有已經建立的子節點,如果發現自己建立的node1的序號是最小的,就認為這個客戶端獲得了鎖;
  3、如果發現node1不是最小的,則還沒有獲取到鎖,監聽比自己建立節點序號小的最大的節點,進入等待;
  4、獲取鎖後,處理完邏輯,刪除自己建立的node1;
  5、刪除4中監聽節點,則客戶端的Watcher會收到相應通知,此時再次判斷自己建立的節點是否是locker子節點中序號最小的,如果是則獲取到了鎖,如果不是則重複以上步驟繼續獲取到比自己小的一個節點並註冊監聽。
  流程如圖:
十九、Redis分散式鎖、Zookeeper分散式鎖
Redis分散式鎖和Zookeeper分散式鎖區別:zk效能差一些,開銷大,實現簡單。

相關文章