日本不卡高字幕在线2019,免费无码又爽又刺激A片,和邻居交换做爰3,国产乱人,好男人看片在线观看免费观看国语

?

Redis實(shí)現(xiàn)的分布式鎖服務(wù)紅鎖(RedLock)

時(shí)間:2025-07-05瀏覽量:262

我們前面文章《分布式鎖服務(wù)的思考》中已經(jīng)提出來(lái)為什么要加鎖,以及對(duì)什么資源加鎖,大家最好先過(guò)去簡(jiǎn)單看一下。今天我們繼續(xù)學(xué)習(xí)一下如何結(jié)合Redis實(shí)現(xiàn)一個(gè)分布式鎖服務(wù)。我們先實(shí)現(xiàn)一個(gè)簡(jiǎn)單的分布式鎖服務(wù),然后分析單節(jié)點(diǎn)鎖存在的問(wèn)題,再由問(wèn)題引入Redis的分布式鎖服務(wù)紅鎖的設(shè)計(jì)。

目錄:

redis簡(jiǎn)單介紹

簡(jiǎn)單的分布式鎖服務(wù)

可靠的分布式鎖服務(wù)

代碼示例

1.Redis簡(jiǎn)單介紹

Redis本身是內(nèi)存數(shù)據(jù)庫(kù),適合用來(lái)對(duì)熱點(diǎn)數(shù)據(jù)、瞬時(shí)數(shù)據(jù)(expire)、近似統(tǒng)計(jì)數(shù)據(jù)做存儲(chǔ),不小心丟失了部分?jǐn)?shù)據(jù)也不要緊。例如我們用來(lái)統(tǒng)計(jì)每個(gè)IP的訪問(wèn)頻率,用來(lái)做限流或者防止爬蟲(chóng),同時(shí)也記錄IP和對(duì)應(yīng)的登錄用戶ID,防止惡意接口檢測(cè)。同時(shí)Redis具有一個(gè)特征:結(jié)合Lua腳本可以實(shí)現(xiàn)原子性操作,我們可以利用Redis的這個(gè)特點(diǎn),來(lái)實(shí)現(xiàn)一個(gè)鎖服務(wù)。

2.使用Redis實(shí)現(xiàn)一個(gè)不可靠的分布式鎖服務(wù)

主要的指令:

該指令對(duì)key=resource的資源加過(guò)期時(shí)間為3000ms的鎖,如果該資源已經(jīng)被加鎖了,說(shuō)明key存在,本次加鎖失敗。

釋放鎖的Lua腳本如下:

我們使用Java代碼結(jié)合上面的Lua腳本實(shí)現(xiàn)一個(gè)簡(jiǎn)單的鎖,如下:

思考:

既然單節(jié)點(diǎn)存在單點(diǎn)故障,我們添加一個(gè)slave可以嗎?不可以,因?yàn)閞edis的主備是異步復(fù)制。

客戶端A在master上獲得鎖,之后master在沒(méi)有同步到slave就崩潰了。

slave提升為master,客戶端B在新的master上獲得了A已經(jīng)獲得的資源鎖。

非分布式或集群的系統(tǒng)本身就沒(méi)有可靠性可言,所以上面我們討論的鎖在非分布式系統(tǒng)中可以應(yīng)用良好。下面帶大家認(rèn)識(shí)下Redis的分布式鎖服務(wù)——紅鎖。

3.利用Redis實(shí)現(xiàn)可靠的分布式鎖服務(wù)——紅鎖

Redis把分布式鎖的算法稱之為紅鎖,Redis+Lock=RedLock。紅鎖需要N個(gè)(=3)Redis獨(dú)立節(jié)點(diǎn),這些節(jié)點(diǎn)相互之間不需要有信息交流,保持獨(dú)立即可。紅鎖基本的思路是:客戶端在每個(gè)Redis實(shí)例上獲得鎖(就是上面講過(guò)的指令),只要大多數(shù)實(shí)例上成功獲得鎖就算加鎖成功。紅鎖的算法已經(jīng)有很多實(shí)現(xiàn)版本,JAVA對(duì)應(yīng)的實(shí)現(xiàn)版本是Redisson,我們可以在業(yè)務(wù)中直接引入并使用。雖然不需要我們自己去實(shí)現(xiàn)算法,但是有必要了解一下紅鎖的算法,下面我們描述一下客戶端獲得鎖的流程:

客戶端首先記錄當(dāng)前時(shí)間,用于后面計(jì)算總耗時(shí)。

客戶端使用相同的key和隨機(jī)value,從所有的Redis節(jié)點(diǎn)上獲得鎖??蛻舳嗽诿總€(gè)實(shí)例上設(shè)置鎖的過(guò)程中,需要設(shè)超時(shí)時(shí)間(5-50ms),不成功就換下一個(gè)實(shí)例繼續(xù)設(shè)置鎖,用來(lái)防止客戶端阻塞在一個(gè)down掉都實(shí)例上。

客戶端需要計(jì)算獲得鎖的總耗時(shí)??蛻舳藦闹辽貼/2+1個(gè)節(jié)點(diǎn)上成功獲得鎖,且總耗時(shí)小于鎖過(guò)期時(shí)間才能成功獲得鎖。

客戶端獲得鎖之后,該鎖的有效期不再是最初的過(guò)期時(shí)間,因?yàn)榭蛻舳艘獜亩鄠€(gè)節(jié)點(diǎn)上獲得鎖,需要去掉這些過(guò)程耗時(shí)。

如果客戶端最終獲得鎖失敗,必須在所有節(jié)點(diǎn)上執(zhí)行鎖釋放。

以上算法保證了:

鎖互斥性,同一時(shí)間只能有一個(gè)鎖

不會(huì)死鎖,使用鎖過(guò)期時(shí)間。

多節(jié)點(diǎn)容錯(cuò),只要大多數(shù)節(jié)點(diǎn)獲取了鎖就可以認(rèn)為成功獲取鎖。

4.Redisson實(shí)現(xiàn)的分布式鎖

Redisson是基于Netty、Redis、JDK實(shí)現(xiàn)的更上層的應(yīng)用工具,它提供了分布式對(duì)象和服務(wù)。Redisson命令的發(fā)送可以支持同步方式,異步方式,Redisson可以支持多種Redis的實(shí)際部署方式,例如:?jiǎn)喂?jié)點(diǎn)、集群、主備、熱備、哨兵、云服務(wù)??蓞⒖枷旅婀俜降募軜?gòu)圖:

我們使用Redisson的分布式鎖服務(wù),因?yàn)镽edisson支持Redis的集群部署、熱備部署、哨兵部署、主備部署多種方式,而今天我們重點(diǎn)不在Redis的部署,所以我們就簡(jiǎn)單部署3個(gè)獨(dú)立的Redis節(jié)點(diǎn)就可以實(shí)驗(yàn)了。

使用編碼的方式獲得Redisson實(shí)例

通過(guò)3個(gè)實(shí)例,獲得紅鎖

加鎖和釋放鎖

我們通過(guò)上面的代碼片段,簡(jiǎn)單寫(xiě)一個(gè)工具類(lèi):

貼圖保格式

總結(jié)

Redis的應(yīng)用場(chǎng)景簡(jiǎn)介。這里大家先思考redis開(kāi)發(fā)模式和規(guī)范,強(qiáng)調(diào)下,僅僅使用key-value是很恐怖的事情。

我們分析了單節(jié)點(diǎn)Redis的鎖不可靠,引入了紅鎖算法。

帶領(lǐng)大家認(rèn)識(shí)了功能豐富的Redisson,我們僅介紹了紅鎖功能。