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...