譯自: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ù)?。在我們地例子中N=5,這是一個(gè)合理地值,因此需要在5個(gè)不同的電腦或虛擬機(jī)上運(yùn)行5個(gè)Redis實(shí)例以確保他們之間地相互獨(dú)立。
為了取得鎖,客戶端執(zhí)行以下操作:
1. 獲取當(dāng)前毫秒級(jí)時(shí)間Start。
2. 試著用相同的key和value順序地對(duì)N個(gè)Redis實(shí)例進(jìn)行加鎖。該步驟中,在為每個(gè)實(shí)例設(shè)置鎖的同時(shí),客戶端會(huì)使用一個(gè)超時(shí)時(shí)間timeout,timeout小于鎖的自動(dòng)釋放時(shí)間ValidityTime。例如:如果ValidityTime=10s,則timeout應(yīng)該在5~50ms之間。這可以使一個(gè)實(shí)例宕機(jī)時(shí),客戶端阻塞的時(shí)間更短,當(dāng)一個(gè)Redis實(shí)例不可達(dá)時(shí),應(yīng)該盡快的去對(duì)另一個(gè)實(shí)例加鎖。
3.?獲取當(dāng)前毫秒級(jí)時(shí)間End, End - Start = Elapsed, Elapsed是客戶端為了獲得鎖而花費(fèi)的時(shí)間。當(dāng)且僅當(dāng)客戶端在所有實(shí)例中取得的鎖的個(gè)數(shù)占多數(shù),并且花費(fèi)的總時(shí)間Elapsed小于鎖的有效時(shí)間,此時(shí),才會(huì)認(rèn)為加鎖成功。
4. 如果加鎖成功,鎖的有效時(shí)間則是ValidityTime = InitTime-Elapsed,Elapsed如步驟3中計(jì)算。
5. 如果客戶端由于某些原因加鎖失敗,如ValidityTime<=0 或者 n < N/2 + 1。此時(shí),客戶端將會(huì)對(duì)這些實(shí)例進(jìn)行unlock操作。
算法是異步的么?
我們需要更好的說明這個(gè)排他鎖的規(guī)則:只有當(dāng)客戶端在有效時(shí)間ValidityTime內(nèi)完成工作才能保證該排他鎖的有效性。