欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2020年04月15日 09:36:38   作者:cool小伙  
這篇文章主要介紹了分布式鎖三種實(shí)現(xiàn)方式及對(duì)比,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

分布式鎖三種實(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),主要原因是寫(xiě)操作(獲取鎖釋放鎖)都需要在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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • muduo源碼分析之TcpServer模塊詳細(xì)介紹

    muduo源碼分析之TcpServer模塊詳細(xì)介紹

    這篇文章主要介紹了muduo源碼分析之TcpServer模塊,本文通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • 淺談Redis中bind的坑

    淺談Redis中bind的坑

    本文主要介紹了淺談Redis中bind的坑,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • redis?zrange?與?zrangebyscore的區(qū)別解析

    redis?zrange?與?zrangebyscore的區(qū)別解析

    這篇文章主要介紹了redis?zrange與zrangebyscore的區(qū)別,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • Redis之常用數(shù)據(jù)結(jié)構(gòu)哈希表

    Redis之常用數(shù)據(jù)結(jié)構(gòu)哈希表

    這篇文章主要介紹了Redis常用的數(shù)據(jù)結(jié)構(gòu)哈希表,哈希表是一種保存鍵值對(duì)的數(shù)據(jù)結(jié)構(gòu),具有一定的參考價(jià)值,需要的朋友可以參考閱讀
    2023-04-04
  • 分布式鎖為什么要選擇Zookeeper而不是Redis?看完這篇你就明白了

    分布式鎖為什么要選擇Zookeeper而不是Redis?看完這篇你就明白了

    Zookeeper的機(jī)制可以保證分布式鎖實(shí)現(xiàn)業(yè)務(wù)代碼簡(jiǎn)單,成本低,Redis如果要解決分布式鎖的問(wèn)題,對(duì)于一些復(fù)雜的情況,很難解決,成本較高,這篇文章重點(diǎn)給大家介紹分布式鎖選擇Zookeeper 而不是Redis的理由,一起看看吧
    2021-05-05
  • Windows環(huán)境下查看、添加、修改redis數(shù)據(jù)庫(kù)的密碼兩種方式

    Windows環(huán)境下查看、添加、修改redis數(shù)據(jù)庫(kù)的密碼兩種方式

    在Windows系統(tǒng)上設(shè)置Redis密碼的過(guò)程與Linux系統(tǒng)類似,但需注意幾個(gè)關(guān)鍵步驟以確保正確配置,這篇文章主要給大家介紹了關(guān)于Windows環(huán)境下查看、添加、修改redis數(shù)據(jù)庫(kù)的密碼兩種方式,需要的朋友可以參考下
    2024-07-07
  • 基于redis集群設(shè)置密碼的實(shí)例

    基于redis集群設(shè)置密碼的實(shí)例

    今天小編就為大家分享一篇基于redis集群設(shè)置密碼的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • 關(guān)于Redis網(wǎng)絡(luò)模型的源碼詳析

    關(guān)于Redis網(wǎng)絡(luò)模型的源碼詳析

    這篇文章主要給大家介紹了關(guān)于Redis網(wǎng)絡(luò)模型的源碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Redis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 詳解Redis開(kāi)啟遠(yuǎn)程登錄連接

    詳解Redis開(kāi)啟遠(yuǎn)程登錄連接

    本篇文章主要介紹了Redis開(kāi)啟遠(yuǎn)程登錄連接,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • Redis中set類型實(shí)現(xiàn)交集并集差集

    Redis中set類型實(shí)現(xiàn)交集并集差集

    本文主要介紹了Redis中set類型實(shí)現(xiàn)交集并集差集,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06

最新評(píng)論