Redlock算法-Redis官方分布式鎖

譯自: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)完成工作才能保證該排他鎖的有效性。

失敗重試機(jī)制


鎖的釋放


安全性討論


性能,故障恢復(fù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容