Zookeeper Redis分布式鎖,實現與區別

2021-08-22 07:26:13 字數 3273 閱讀 4553

a、原理

redis為單程序單執行緒模式,採用佇列模式將併發訪問變成序列訪問,且多客戶端對redis的連線並不存在競爭關係。其次redis提供一些命令setnx,getset,可以方便實現分布式鎖機制。

public class rediskeylock 

public static rediskeylock getinstance(jedispool pool)

return lock;

}public void lock(final string rediskey) else }}

if (timeoutat < now)

timeunit.nanoseconds.sleep(wait_interval_in_ms);

}if (!flag)

} catch (jedi***ception je)

} catch (exception e) finally }}

public boolean unlock(final string rediskey) catch (jedi***ception je)

return false;

} catch (exception e) finally }}

}

c、**分析

lock:通過間隔時間段去請求redis,來實現阻塞占用,一直到獲取鎖,或者超時。

unlock:刪除redis中key。

a、原理

zookeeper核心是乙個精簡的檔案系統,它提供了一些簡單的檔案操作以及附加的功能 ,它的資料結構原型是一棵znode樹(類似linux的檔案系統),並且它們是一些已經被構建好的塊,可以用來構建大型的協作資料結構和協議 。

每個鎖都需要乙個路徑來指定(如:/geffzhang/lock)

1.根據指定的路徑, 查詢zookeeper集群下的這個節點是否存在.(說明已經有鎖了)

3. 如果不是查詢者的鎖, 則返回null, 說明建立鎖失敗

4. 如果是查詢者的鎖, 則把這個鎖返回給查詢者

5. 如果這個節點不存在, 說明當前沒有鎖, 那麼建立乙個臨時節點, 並將查詢者的特徵資訊寫入這個節點的資料中, 然後返回這個鎖.

據以上5部, 乙個分布式的鎖就可以建立了.

建立的鎖有三種狀態:

1. 建立失敗(null), 說明該鎖被其他查詢者使用了.』

2. 建立成功, 但當前沒有鎖住(unlocked), 可以使用

3. 建立成功, 但當前已經鎖住(locked)了, 不能繼續加鎖.

b、**樣例

public class zookeeperlock implements lock, watcher 

} catch (exception e)

}/**

* zookeeper節點的監視器

*/@override

public void process(watchedevent event)

}@override

public void lock()

}} catch (exception e)

}public boolean trylock()

//建立臨時子節點

myznode = zk.create(root + "/" + lockname + splitstr, data, zoodefs.ids.open_acl_unsafe,createmode.ephemeral_sequential);

//取出所有子節點

listsubnodes = zk.getchildren(root, false);

//取出所有lockname的鎖

listlockobjnodes = new arraylist<>();

for (string node : subnodes)

}collections.sort(lockobjnodes);

if(myznode.equals(root+"/"+lockobjnodes.get(0)))

//如果不是最小的節點,找到比自己小1的節點

string submyznode = myznode.substring(myznode.lastindexof("/") + 1);

waitnode = lockobjnodes.get(collections.binarysearch(lockobjnodes, submyznode) - 1);

} catch (exception e)

return false;

}@override

public boolean trylock(long time, timeunit unit) catch (exception e)

}private boolean waitforlock(string lower, long waittime, timeunit unit) throws interruptedexception, keeperexception

return true;

}@override

public void unlock() catch (exception e)

}private synchronized zookeeper initzk(string server)

} catch (ioexception e)

return zk;

}@override

public void lockinterruptibly() throws interruptedexception

@override

public condition newcondition()

private class lockexception extends runtimeexception

private lockexception(exception e)

}}

c、**分析

lock:根據根建立鎖節點,然後獲取當前已經存在鎖的節點,如果第乙個節點為自己建立,說明沒有鎖,不是自己加鎖,則給自己建立節點的上乙個節點加監聽,執行緒阻塞至上乙個節點釋放,並通知我,或者等待超時。

unlock:刪除自己建立的節點,zookeeper會自動通知加在節點上的監聽。

redis分布式鎖,必須使用者自己間隔時間輪詢去嘗試加鎖,當鎖被釋放後,存在多執行緒去爭搶鎖,並且可能每次間隔時間去嘗試鎖的時候,都不成功,對效能浪費很大。

zookeeper分布鎖,首先建立加鎖標誌檔案,如果需要等待其他鎖,則新增監聽後等待通知或者超時,當有鎖釋放,無須爭搶,按照節點順序,依次通知使用者。

服務啟動 zookeeper redis

在準備好相應的配置之後,可以直接通過zkserver.sh 這個指令碼進行服務的相關操作 zookeeper命令列工具類似於linux的shell環境,不過功能肯定不及shell啦,但是使用它我們可以簡單的對zookeeper進行訪問,資料建立,資料修改等操作.使用 zkcli.sh server ...

分目錄 分埠

分目錄站點 意義 可能有多個cms或框架組成,對於滲透 相當於滲透目標是多個 入侵分目錄下的站點 主站也跟著被入侵 主站與分目錄站點搭建的cms可能不同 找到乙個有漏洞可利用的cms即可對 進行入侵 分埠站點 同理 www.com www.com 8080 www.com 8888 意義 可能有多個...

分糖果 差分約束

description 幼兒園裡有n 個小朋友,lxhgww 老師現在想要給這些小朋友們分配糖果,要求每個小朋友都要分到糖果。但是小朋友們也有嫉妒心,總是會提出一些要求,比如小明不希望小紅分到的糖果比他的多,於是在分配糖果的時候,lxhgww 需要滿足小朋友們的 k個要求。幼兒園的糖果總是有限的,l...