zk 分布式鎖,其實可以做的比較簡單,就是某個節點嘗試建立臨時 znode,此時建立成功了就獲取了這個鎖;這個時候別的客戶端來建立鎖會失敗,只能註冊個***監聽這個鎖。釋放鎖就是刪除這個 znode,一旦釋放掉就會通知客戶端,然後有乙個等待著的客戶端就可以再次重新加鎖。
/**
* zookeepersession
* * @author bingo
* @since 2018/11/29
* */
public class zookeepersession catch (interruptedexception e)
system.out.println("zookeeper session established......");
} catch (exception e)
}/**
* 獲取分布式鎖
* * @param productid
*/public boolean acquiredistributedlock(long productid) catch (exception e)
zookeeper.create(path, "".getbytes(), ids.open_acl_unsafe, createmode.ephemeral);
return true;
} catch (exception ee) }}
return true;
}/**
* 釋放掉乙個分布式鎖
* * @param productid
*/public void releasedistributedlock(long productid) catch (exception e)
}/**
* 建立zk session的watcher
* * @author bingo
* @since 2018/11/29**/
private class zookeeperwatcher implements watcher
if (this.latch != null) }}
/*** 封裝單例的靜態內部類
* * @author bingo
* @since 2018/11/29**/
private static class singleton
public static zookeepersession getinstance()
}/**
* 獲取單例
* * @return
*/public static zookeepersession getinstance()
/*** 初始化單例的便捷方法
*/public static void init()
}
也可以採用另一種方式,建立臨時順序節點:
如果有一把鎖,被多個人給競爭,此時多個人會排隊,第乙個拿到鎖的人會執行,然後釋放鎖;後面的每個人都會去監聽排在自己前面的那個人建立的 node 上,一旦某個人釋放了鎖,排在自己後面的人就會被 zookeeper 給通知,一旦被通知了之後,就 ok 了,自己就獲取到了鎖,就可以執行**了。
public class zookeeperdistributedlock implements watcher catch (ioexception e) catch (keeperexception e) catch (interruptedexception e)
}public void process(watchedevent event)
if (this.latch != null)
}public void acquiredistributedlock() else
} catch (keeperexception e) catch (interruptedexception e)
}public boolean trylock()
//如果不是最小的節點,找到比自己小1的節點
int previouslockindex = -1;
for(int i = 0; i < locks.size(); i++)
}this.waitnode = locks.get(previouslockindex);
} catch (keeperexception e) catch (interruptedexception e)
return false;
}private boolean waitforlock(string waitnode, long waittime) throws interruptedexception, keeperexception
return true;
}public void unlock() catch (interruptedexception e) catch (keeperexception e)
}public class lockexception extends runtimeexception
public lockexception(exception e)
}}
ZK分布式鎖
分布式鎖是控制分布式系統之間同步訪問共享資源的一種方式。如果不同的系統或者是同乙個系統的不同主機之間共享了乙個或者一組資源,那麼訪問這些資源的時候,往往需要一些互斥手段來防止彼此之間的干擾,以保證一致性,在這種情況下,就需要分布式鎖了 zookeeper中有一種節點叫做順序節點,假如我們在 lock...
zk實現分布式鎖
前言 2016春節之後一直比較忙,因此部落格n個沒有更新,現在也是忙裡偷閒,偷偷的更新一篇!一 分布式鎖介紹 分布式鎖主要用於在分布式環境中保護跨程序 跨主機 跨網路的共享資源實現互斥訪問,以達到保證資料的一致性。二 架構介紹 在介紹使用zookeeper實現分布式鎖之前,首先看當前的系統架構圖 解...
redis與zk實現分布式鎖
概述 那麼這個時候,如果你需要加個鎖,讓多個分布式的機器在訪問共享資源的時候序列起來 那麼這個時候,那個鎖,多個不同機器上的服務共享的鎖,就是分布式鎖 分布式鎖當然有很多種不同的實現方案,redis分布式鎖,zookeeper分布式鎖對比 資料庫鎖 優點 直接使用資料庫,使用簡單。缺點 分布式系統大...