redis分布式鎖解決可重入 redis分布式鎖釋放問題
夕逆IT
- 數(shù)據(jù)庫
- 2023-08-13 10:52:15
- 539

大家好,如果您還對(duì)redis分布式鎖解決可重入不太了解,沒有關(guān)系,今天就由本站為大家分享redis分布式鎖解決可重入的知識(shí),包括redis分布式鎖釋放問題的問題都會(huì)給大...
大家好,如果您還對(duì)redis分布式鎖解決可重入不太了解,沒有關(guān)系,今天就由本站為大家分享redis分布式鎖解決可重入的知識(shí),包括redis分布式鎖釋放問題的問題都會(huì)給大家分析到,還望可以解決大家的問題,下面我們就開始吧!
redissession分布式鎖原理
redission為redis官網(wǎng)發(fā)布的分布式解決方案,redission中包含了我們了解的常用鎖的類型,基本的可重入鎖,讀寫鎖,以及CountDownLatch的設(shè)置及使用,但是他們是分布式鎖,以往我們JUC提供的鎖都是在單線程的線程模型中使用的,當(dāng)多個(gè)進(jìn)程多個(gè)線程來操作一個(gè)無鎖的共享資源的時(shí)候,就會(huì)出現(xiàn)線程不安全的問題,就是我們多次執(zhí)行后結(jié)果和單個(gè)線程執(zhí)行時(shí)結(jié)果的不一致,為了讓線程一致我們是需要一些處理辦法的,那就是分布式鎖,通過鎖進(jìn)行多線程的同步來進(jìn)行資源隔離來實(shí)現(xiàn)對(duì)資源的訪問控制,從而達(dá)到線程安全
如何使用RedLock實(shí)現(xiàn)分布式鎖
紅鎖(RedLock)是用于分布式網(wǎng)絡(luò)系統(tǒng)中的一種操作控制機(jī)制,即分布式鎖。它解決的問題是在多個(gè)主機(jī)的系統(tǒng)里,保證用戶的寫操作的安全性,一致性和高效性。
在分布式網(wǎng)絡(luò)中,操作的一致性和高效性是矛盾的,為什么呢?“高效”是指在單位時(shí)間里完成的并發(fā)操作越多越好,越快越好;而“一致”是指在網(wǎng)絡(luò)中某個(gè)特定數(shù)據(jù)在各個(gè)主機(jī)中的值是相同的,當(dāng)一個(gè)用戶訪問時(shí)不會(huì)出現(xiàn)在一個(gè)主機(jī)上是舊值,在另一主機(jī)上是新值的情況。為了數(shù)據(jù)“一致”,在一個(gè)用戶更新某個(gè)數(shù)據(jù)時(shí),其他的用戶請求必須等待前面的用戶在全部主機(jī)上完成操作后才可以訪問,否則就可能出現(xiàn)訪問結(jié)果不一致的情況。這種等待的時(shí)間越長,自然系統(tǒng)的效率就越低。如果縮短等待時(shí)間,效率會(huì)提高,但是有可能上一個(gè)用戶還沒有完成全部操作,數(shù)據(jù)就出現(xiàn)不一致。所以,一致性和高效性就成為一對(duì)避不開的矛盾。
好的算法自然是把這兩項(xiàng)都能提高,就是在保證數(shù)據(jù)安全的前提下,盡量縮短一個(gè)用戶占用全部主機(jī)資源的時(shí)間。紅鎖就是一個(gè)比較好的解決方案。其原理如下:
假設(shè)系統(tǒng)中有7臺(tái)主機(jī),設(shè)一個(gè)設(shè)鎖的有效時(shí)間作為最長允許用時(shí)。用戶發(fā)出更新請求。
開始計(jì)時(shí)從第1個(gè)到第7個(gè)主機(jī)挨個(gè)加鎖,其中:如果某個(gè)主機(jī)加鎖的時(shí)間超過預(yù)定時(shí)間(如:50毫秒),則認(rèn)為此主機(jī)已經(jīng)不可用,立即放棄并進(jìn)入下一個(gè)主機(jī)加鎖。如果在嘗試7個(gè)主機(jī)后,只有3個(gè)或更少的主機(jī)加鎖成功(少于N/2+1),則認(rèn)為本次加鎖失敗,將成功加鎖的主機(jī)立即去除鎖,返回用戶,報(bào)告加鎖失敗。如果全部加鎖完畢后所用的時(shí)間小于最初設(shè)定的有效時(shí)間,并且加鎖的主機(jī)數(shù)超過一半(4臺(tái)或更多),則認(rèn)為加鎖成功。反之,則認(rèn)為加鎖失敗。其他的用戶不定時(shí)的發(fā)出加鎖請求,一旦請求成功則進(jìn)入新的加鎖程序。“加鎖”,就是用戶給主機(jī)設(shè)一個(gè)特定的屬性值Key,同一個(gè)用戶的Key在所有的7臺(tái)主機(jī)是一樣的,其對(duì)應(yīng)的屬性值是隨機(jī)產(chǎn)生的值。當(dāng)Key在預(yù)定時(shí)間內(nèi)過半數(shù)的主機(jī)成功設(shè)定,則鎖就加上了。如果想解鎖,就將這個(gè)Key值刪除。用戶想給主機(jī)加鎖,要先檢查Key是否已經(jīng)存在。如果Key已經(jīng)設(shè)了值,而這個(gè)值不是這個(gè)用戶自己設(shè)定的,就放棄加鎖,等待一段時(shí)間后再來嘗試,直到Key是空值了就可以設(shè)定新的Key值來加鎖。
紅鎖這樣設(shè)定,是保證系統(tǒng)里一臺(tái)或多臺(tái)主機(jī)宕機(jī)了,設(shè)鎖的程序仍然可以繼續(xù)而不至于導(dǎo)致整個(gè)程序夯停。另外每個(gè)用戶申請程序的等待時(shí)間也是隨機(jī)的,可以避免多個(gè)用戶在同一時(shí)刻申請加鎖導(dǎo)致程序死鎖。這樣系統(tǒng)鎖的排他性就可以保證了。同時(shí),系統(tǒng)處理并發(fā)的效率也比較高。
好了,本文到此結(jié)束,如果可以幫助到大家,還望關(guān)注本站哦!
本文鏈接:http:///su/1123.html