Redis分布式鎖詳解

在互聯(lián)網(wǎng)分布式服務(wù)部署中,通常會(huì)遇到多個(gè)進(jìn)程操作同一個(gè)資源的情況,例如秒殺等,此文章主要介紹使用Redis實(shí)現(xiàn)分布式鎖。

Redis為單進(jìn)程單線程模式,采用隊(duì)列模式將并發(fā)訪問(wèn)變?yōu)榇性L問(wèn)。通常使用setnx(即set not exiest)來(lái)實(shí)現(xiàn)鎖,以下通過(guò)循序漸進(jìn)的方式引入最終實(shí)現(xiàn)。

方案一

1. C1通過(guò)setnx獲取鎖,處理業(yè)務(wù),C1通過(guò)del釋放鎖

問(wèn)題:如果處理業(yè)務(wù)期間C1崩潰,導(dǎo)致死鎖

方案二

1. C1通過(guò)setnx獲取鎖,鎖里面設(shè)置為時(shí)間戳,全局業(yè)務(wù)中有配置超時(shí)時(shí)間EXPIRE,處理業(yè)務(wù),C1由于其他原因崩潰

2. C2,C3通過(guò)setnx獲取鎖失敗

3. 使用get獲取T1,T2,且CURTIME>T1(T2)+EXPIRE,超時(shí)(若未超時(shí),則sleep,然后重新進(jìn)入第2步)

4. C2,C3分別使用del刪除鎖

5. C2,C3分別使用setnx獲取鎖(若未獲取到,則sleep,然后重新進(jìn)入第2步)

問(wèn)題:C2,C3串行執(zhí)行情況下,C2獲取的鎖會(huì)被C3刪除,從而導(dǎo)致競(jìng)態(tài)

方案三

1. C1通過(guò)setnx獲取鎖,鎖里面設(shè)置為時(shí)間戳,全局業(yè)務(wù)中有配置超時(shí)時(shí)間EXPIRE,處理業(yè)務(wù),C1由于其他原因崩潰

2. C2,C3通過(guò)setnx獲取鎖失敗

3. 使用get獲取T1,T2(為nil也進(jìn)入判斷),且CURTIME>T1(T2)+EXPIRE,超時(shí)(若未超時(shí),則sleep,然后重新進(jìn)入第2步)

4. C2,C3分別使用getset,獲取到T11,T22(為nil也進(jìn)入判斷),此時(shí)若T11=T1則C2獲取鎖(T22=T2則C3獲取鎖,二者只會(huì)有1個(gè)成立),執(zhí)行業(yè)務(wù)。(若未獲取到的,則sleep,然后重新進(jìn)入第2步)

最后編輯于
?著作權(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),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 目前實(shí)現(xiàn)分布式鎖的方式主要有數(shù)據(jù)庫(kù)、Redis和Zookeeper三種,本文主要闡述利用Redis的相關(guān)命令來(lái)實(shí)現(xiàn)...
    Aldeo閱讀 2,180評(píng)論 0 6
  • 1、競(jìng)態(tài)條件: 定義:競(jìng)態(tài)條件指的是一種特殊的情況,在這種情況下各個(gè)執(zhí)行單元以一種沒(méi)有邏輯的順序執(zhí)行動(dòng)作,從而導(dǎo)致...
    Hughman閱讀 1,442評(píng)論 0 7
  • 分布式鎖的解決方式 基于數(shù)據(jù)庫(kù)表做樂(lè)觀鎖,用于分布式鎖。(適用于小并發(fā)) 使用memcached的add()方法,...
    xiaolyuh閱讀 15,838評(píng)論 6 17
  • 線程 1.同步概念 1.多線程開發(fā)可能遇到的問(wèn)題 同步不是一起的意思,是協(xié)同步調(diào) 假設(shè)兩個(gè)線程t1和t2都要對(duì)nu...
    TENG書閱讀 713評(píng)論 0 1
  • Redis有一系列的命令,特點(diǎn)是以NX結(jié)尾,NX是Not eXists的縮寫,如SETNX命令就應(yīng)該理解為:SET...
    我愿是你的左右手閱讀 511評(píng)論 2 1

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