十9、Redis分佈式鎖、Zookeeper分佈式鎖

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

2、Zookeeper分佈式鎖
  一、客戶端對某個方法加鎖時,在zk上的與該方法對應的指定locker節點的目錄下,生成一個惟一的瞬時有序節點node1;
   二、客戶端獲取該路徑下全部已經建立的子節點,若是發現本身建立的node1的序號是最小的,就認爲這個客戶端得到了鎖;
  三、若是發現node1不是最小的,則尚未獲取到鎖,監聽比本身建立節點序號小的最大的節點,進入等待;
  四、獲取鎖後,處理完邏輯,刪除本身建立的node1;
  五、刪除4中監聽節點,則客戶端的Watcher會收到相應通知,此時再次判斷本身建立的節點是不是locker子節點中序號最小的,若是是則獲取到了鎖,若是不是則重複以上步驟繼續獲取到比本身小的一個節點並註冊監聽。
  流程如圖:
Redis分佈式鎖和Zookeeper分佈式鎖區別:zk性能差一些,開銷大,實現簡單。
相關文章
相關標籤/搜索