使用Redis和zookeeper實現分布式鎖

2021-10-19 10:42:01 字數 1190 閱讀 2922

redis分布式鎖:

/**

* 獲取鎖

* @param lockkey 鎖

* @param identity 身份標識(保證鎖不會被其他人釋放)

* @param expiretime 鎖的過期時間(單位:秒)

* @return

*/public boolean lock(string lockkey, string identity, long expiretime)

加鎖的方法只需要三個引數:lockkey、identity、expiretime。

第乙個引數lockkey為key,乙個資源對應乙個唯一的key。

第二個引數identity為身份標識,作為此key對應的value儲存,為了判斷在釋放鎖時是不是和加鎖的身份相同,防止別人釋放鎖。

第三個引數expiretime為過期時間,此引數保證程式加鎖後崩潰導致不能主動釋放鎖的時候自動釋放鎖,防止出現死鎖。

/**

* 釋放鎖

* @param lockkey 鎖

* @param identity 身份標識(保證鎖不會被其他人釋放)

* @return

*/public boolean releaselock(string lockkey, string identity)

解鎖的方法只需兩個引數:lockkey、identity。

第乙個引數lockkey為key,乙個資源對應乙個唯一的key。

第二個引數identity為身份標識,作為此key對應的value儲存,為了判斷在釋放鎖時是不是和加鎖的身份相同,防止別人釋放鎖。

此處使用lua指令碼來判斷身份,身份相同就刪除,身份不同就不對資料做操作並返回失敗。為什麼要使用lua指令碼呢?這是為了要保證操作的原子性,redis在執行lua指令碼的時候是把指令碼當作乙個命令來執行的,我們都知道redis的命令是都是原子操作,這樣就保證了操作的原子性。

建立乙個鎖目錄 /lock;

當乙個客戶端需要獲取鎖時,在 /lock 下建立臨時的且有序的子節點;

客戶端獲取 /lock 下的子節點列表,判斷自己建立的子節點是否為當前子節點列表中序號最小的子節點,如果是,則認為獲得鎖;否則監聽自己的前乙個子節點,獲得子節點的變更通知後重複此步驟直至獲得鎖;

執行業務**,完成後,刪除對應的子節點。

1 Windows安裝和使用zookeeper

本文介紹的 zookeeper 是以 3.4.5 這個穩定版本為基礎,最新的版本可以通過官網來獲取,zookeeper 的安裝非常簡單,下面將從單機模式和集群模式兩個方面介紹 zookeeper 的windows安裝和配置.單機模式 單機安裝非常簡單,只要獲取到 zookeeper 的壓縮包並解壓到...

redis安裝和使用

1 安裝redis 上傳檔案到固定目錄下 版本為 redis 3.2.0 tar xzvf redis 3.2 0.tar gzcd redis 3.2 0make make install2 啟動redis redis server redis.conf3 一般不會在原配置檔案上進行修改,原配置檔...

Redis配置和使用

jedispoolconfig需要配置的幾個引數 最大連線數 redis.maxtotal 60 最大空閒連線數 redis.maxidle 20 初始化連線數 redis.minidle 5 當資源連線池的連線用盡後,呼叫者的最大等待時間 redis.maxwaitmillis 6000 定時對執...