譯自:redis官方文檔
Redlock算法
在分布式版本的算法中乍钻,我們假設(shè)有N個(gè)Redis實(shí)例肛循,這些節(jié)點(diǎn)是完全獨(dú)立的,因此银择,我們不需要復(fù)制或任何其他的協(xié)調(diào)方法多糠。在單機(jī)模式中,我們已經(jīng)描述了怎樣安全地取得和釋放鎖欢摄。我們認(rèn)為Redlock算法在單機(jī)模式中將會(huì)使用這種方法去取得和釋放鎖是理所應(yīng)當(dāng)?shù)匕旧ァT谖覀兊乩又蠳=5,這是一個(gè)合理地值怀挠,因此需要在5個(gè)不同的電腦或虛擬機(jī)上運(yùn)行5個(gè)Redis實(shí)例以確保他們之間地相互獨(dú)立析蝴。
為了取得鎖,客戶(hù)端執(zhí)行以下操作:
1. 獲取當(dāng)前毫秒級(jí)時(shí)間Start绿淋。
2. 試著用相同的key和value順序地對(duì)N個(gè)Redis實(shí)例進(jìn)行加鎖闷畸。該步驟中,在為每個(gè)實(shí)例設(shè)置鎖的同時(shí)吞滞,客戶(hù)端會(huì)使用一個(gè)超時(shí)時(shí)間timeout佑菩,timeout小于鎖的自動(dòng)釋放時(shí)間ValidityTime盾沫。例如:如果ValidityTime=10s,則timeout應(yīng)該在5~50ms之間殿漠。這可以使一個(gè)實(shí)例宕機(jī)時(shí)赴精,客戶(hù)端阻塞的時(shí)間更短,當(dāng)一個(gè)Redis實(shí)例不可達(dá)時(shí)绞幌,應(yīng)該盡快的去對(duì)另一個(gè)實(shí)例加鎖蕾哟。
3.?獲取當(dāng)前毫秒級(jí)時(shí)間End, End - Start = Elapsed, Elapsed是客戶(hù)端為了獲得鎖而花費(fèi)的時(shí)間。當(dāng)且僅當(dāng)客戶(hù)端在所有實(shí)例中取得的鎖的個(gè)數(shù)占多數(shù)莲蜘,并且花費(fèi)的總時(shí)間Elapsed小于鎖的有效時(shí)間谭确,此時(shí),才會(huì)認(rèn)為加鎖成功票渠。
4. 如果加鎖成功逐哈,鎖的有效時(shí)間則是ValidityTime = InitTime-Elapsed,Elapsed如步驟3中計(jì)算问顷。
5. 如果客戶(hù)端由于某些原因加鎖失敗昂秃,如ValidityTime<=0 或者 n < N/2 + 1。此時(shí)择诈,客戶(hù)端將會(huì)對(duì)這些實(shí)例進(jìn)行unlock操作械蹋。
算法是異步的么?
我們需要更好的說(shuō)明這個(gè)排他鎖的規(guī)則:只有當(dāng)客戶(hù)端在有效時(shí)間ValidityTime內(nèi)完成工作才能保證該排他鎖的有效性羞芍。