主頁(yè) > 知識(shí)庫(kù) > 分布式鎖三種實(shí)現(xiàn)方式及對(duì)比

分布式鎖三種實(shí)現(xiàn)方式及對(duì)比

熱門標(biāo)簽:呼叫中心市場(chǎng)需求 網(wǎng)站排名優(yōu)化 Linux服務(wù)器 鐵路電話系統(tǒng) 百度競(jìng)價(jià)排名 地方門戶網(wǎng)站 服務(wù)外包 AI電銷

分布式鎖三種實(shí)現(xiàn)方式:

1. 基于數(shù)據(jù)庫(kù)實(shí)現(xiàn)分布式鎖;

2. 基于緩存(Redis等)實(shí)現(xiàn)分布式鎖;

3. 基于Zookeeper實(shí)現(xiàn)分布式鎖;

一, 基于數(shù)據(jù)庫(kù)實(shí)現(xiàn)分布式鎖

1. 悲觀鎖

利用select … where … for update 排他鎖

注意: 其他附加功能與實(shí)現(xiàn)一基本一致,這里需要注意的是“where name=lock ”,name字段必須要走索引,否則會(huì)鎖表。有些情況下,比如表不大,mysql優(yōu)化器會(huì)不走這個(gè)索引,導(dǎo)致鎖表問(wèn)題。

2. 樂(lè)觀鎖

所謂樂(lè)觀鎖與前邊最大區(qū)別在于基于CAS思想,是不具有互斥性,不會(huì)產(chǎn)生鎖等待而消耗資源,操作過(guò)程中認(rèn)為不存在并發(fā)沖突,只有update version失敗后才能覺(jué)察到。我們的搶購(gòu)、秒殺就是用了這種實(shí)現(xiàn)以防止超賣。

通過(guò)增加遞增的版本號(hào)字段實(shí)現(xiàn)樂(lè)觀鎖

二, 基于緩存(Redis等)實(shí)現(xiàn)分布式鎖

1. 使用命令介紹:

(1)SETNX

SETNX key val:當(dāng)且僅當(dāng)key不存在時(shí),set一個(gè)key為val的字符串,返回1;若key存在,則什么都不做,返回0。

(2)expire

expire key timeout:為key設(shè)置一個(gè)超時(shí)時(shí)間,單位為second,超過(guò)這個(gè)時(shí)間鎖會(huì)自動(dòng)釋放,避免死鎖。

(3)delete

delete key:刪除key

在使用Redis實(shí)現(xiàn)分布式鎖的時(shí)候,主要就會(huì)使用到這三個(gè)命令。

2. 實(shí)現(xiàn)思想:

(1)獲取鎖的時(shí)候,使用setnx加鎖,并使用expire命令為鎖添加一個(gè)超時(shí)時(shí)間,超過(guò)該時(shí)間則自動(dòng)釋放鎖,鎖的value值為一個(gè)隨機(jī)生成的UUID,通過(guò)此在釋放鎖的時(shí)候進(jìn)行判斷。

(2)獲取鎖的時(shí)候還設(shè)置一個(gè)獲取的超時(shí)時(shí)間,若超過(guò)這個(gè)時(shí)間則放棄獲取鎖。

(3)釋放鎖的時(shí)候,通過(guò)UUID判斷是不是該鎖,若是該鎖,則執(zhí)行delete進(jìn)行鎖釋放。

三, 基于Zookeeper實(shí)現(xiàn)分布式鎖

ZooKeeper是一個(gè)為分布式應(yīng)用提供一致性服務(wù)的開(kāi)源組件,它內(nèi)部是一個(gè)分層的文件系統(tǒng)目錄樹(shù)結(jié)構(gòu),規(guī)定同一個(gè)目錄下只能有一個(gè)唯一文件名?;赯ooKeeper實(shí)現(xiàn)分布式鎖的步驟如下:

(1)創(chuàng)建一個(gè)目錄mylock;
(2)線程A想獲取鎖就在mylock目錄下創(chuàng)建臨時(shí)順序節(jié)點(diǎn);
(3)獲取mylock目錄下所有的子節(jié)點(diǎn),然后獲取比自己小的兄弟節(jié)點(diǎn),如果不存在,則說(shuō)明當(dāng)前線程順序號(hào)最小,獲得鎖;
(4)線程B獲取所有節(jié)點(diǎn),判斷自己不是最小節(jié)點(diǎn),設(shè)置監(jiān)聽(tīng)比自己次小的節(jié)點(diǎn);
(5)線程A處理完,刪除自己的節(jié)點(diǎn),線程B監(jiān)聽(tīng)到變更事件,判斷自己是不是最小的節(jié)點(diǎn),如果是則獲得鎖。

這里推薦一個(gè)Apache的開(kāi)源庫(kù)Curator,它是一個(gè)ZooKeeper客戶端,Curator提供的InterProcessMutex是分布式鎖的實(shí)現(xiàn),acquire方法用于獲取鎖,release方法用于釋放鎖。

優(yōu)點(diǎn):具備高可用、可重入、阻塞鎖特性,可解決失效死鎖問(wèn)題。

缺點(diǎn):因?yàn)樾枰l繁的創(chuàng)建和刪除節(jié)點(diǎn),性能上不如Redis方式。

四,對(duì)比

數(shù)據(jù)庫(kù)分布式鎖實(shí)現(xiàn)

缺點(diǎn):

1.db操作性能較差,并且有鎖表的風(fēng)險(xiǎn)

2.非阻塞操作失敗后,需要輪詢,占用cpu資源;

3.長(zhǎng)時(shí)間不commit或者長(zhǎng)時(shí)間輪詢,可能會(huì)占用較多連接資源

Redis(緩存)分布式鎖實(shí)現(xiàn)

缺點(diǎn):

1.鎖刪除失敗 過(guò)期時(shí)間不好控制

2.非阻塞,操作失敗后,需要輪詢,占用cpu資源;

ZK分布式鎖實(shí)現(xiàn)

缺點(diǎn):性能不如redis實(shí)現(xiàn),主要原因是寫操作(獲取鎖釋放鎖)都需要在Leader上執(zhí)行,然后同步到follower。

總之:ZooKeeper有較好的性能和可靠性。

從理解的難易程度角度(從低到高)數(shù)據(jù)庫(kù) > 緩存 > Zookeeper

從實(shí)現(xiàn)的復(fù)雜性角度(從低到高)Zookeeper >= 緩存 > 數(shù)據(jù)庫(kù)

從性能角度(從高到低)緩存 > Zookeeper >= 數(shù)據(jù)庫(kù)

從可靠性角度(從高到低)Zookeeper > 緩存 > 數(shù)據(jù)庫(kù)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • SpringBoot使用Redisson實(shí)現(xiàn)分布式鎖(秒殺系統(tǒng))
  • Java Redis分布式鎖的正確實(shí)現(xiàn)方式詳解
  • 談?wù)凴edis分布式鎖的正確實(shí)現(xiàn)方法
  • Redis實(shí)現(xiàn)分布式鎖和等待序列的方法示例
  • 淺談Redis分布式鎖的正確實(shí)現(xiàn)方式
  • 淺談Java(SpringBoot)基于zookeeper的分布式鎖實(shí)現(xiàn)
  • Java使用Redisson分布式鎖實(shí)現(xiàn)原理
  • java基于jedisLock—redis分布式鎖實(shí)現(xiàn)示例代碼
  • Redis實(shí)現(xiàn)分布式鎖的幾種方法總結(jié)

標(biāo)簽:銅川 衡水 湖南 湘潭 崇左 蘭州 仙桃 黃山

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《分布式鎖三種實(shí)現(xiàn)方式及對(duì)比》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266