婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 分布式鎖三種實現方式及對比

分布式鎖三種實現方式及對比

熱門標簽:地圖標注工廠入駐 400電話辦理的口碑 高碑店市地圖標注app 一個地圖標注多少錢 四川穩(wěn)定外呼系統(tǒng)軟件 廊坊外呼系統(tǒng)在哪買 臺灣電銷 b2b外呼系統(tǒng) 南京手機外呼系統(tǒng)廠家

分布式鎖三種實現方式:

1. 基于數據庫實現分布式鎖;

2. 基于緩存(Redis等)實現分布式鎖;

3. 基于Zookeeper實現分布式鎖;

一, 基于數據庫實現分布式鎖

1. 悲觀鎖

利用select … where … for update 排他鎖

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

2. 樂觀鎖

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

通過增加遞增的版本號字段實現樂觀鎖

二, 基于緩存(Redis等)實現分布式鎖

1. 使用命令介紹:

(1)SETNX

SETNX key val:當且僅當key不存在時,set一個key為val的字符串,返回1;若key存在,則什么都不做,返回0。

(2)expire

expire key timeout:為key設置一個超時時間,單位為second,超過這個時間鎖會自動釋放,避免死鎖。

(3)delete

delete key:刪除key

在使用Redis實現分布式鎖的時候,主要就會使用到這三個命令。

2. 實現思想:

(1)獲取鎖的時候,使用setnx加鎖,并使用expire命令為鎖添加一個超時時間,超過該時間則自動釋放鎖,鎖的value值為一個隨機生成的UUID,通過此在釋放鎖的時候進行判斷。

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

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

三, 基于Zookeeper實現分布式鎖

ZooKeeper是一個為分布式應用提供一致性服務的開源組件,它內部是一個分層的文件系統(tǒng)目錄樹結構,規(guī)定同一個目錄下只能有一個唯一文件名。基于ZooKeeper實現分布式鎖的步驟如下:

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

這里推薦一個Apache的開源庫Curator,它是一個ZooKeeper客戶端,Curator提供的InterProcessMutex是分布式鎖的實現,acquire方法用于獲取鎖,release方法用于釋放鎖。

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

缺點:因為需要頻繁的創(chuàng)建和刪除節(jié)點,性能上不如Redis方式。

四,對比

數據庫分布式鎖實現

缺點:

1.db操作性能較差,并且有鎖表的風險

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

3.長時間不commit或者長時間輪詢,可能會占用較多連接資源

Redis(緩存)分布式鎖實現

缺點:

1.鎖刪除失敗 過期時間不好控制

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

ZK分布式鎖實現

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

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

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

從實現的復雜性角度(從低到高)Zookeeper >= 緩存 > 數據庫

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

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

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

標簽:畢節(jié) 泰州 定州 伊春 河源 甘南 拉薩 南寧

巨人網絡通訊聲明:本文標題《分布式鎖三種實現方式及對比》,本文關鍵詞  分布式,鎖,三種,實現,方式,;如發(fā)現本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《分布式鎖三種實現方式及對比》相關的同類信息!
  • 本頁收集關于分布式鎖三種實現方式及對比的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 如东县| 青铜峡市| 西充县| 若尔盖县| 广灵县| 陵川县| 禹州市| 金华市| 阳山县| 庄河市| 谷城县| 寿光市| 蒙自县| 浪卡子县| 平安县| 富裕县| 章丘市| 武鸣县| 同德县| 姜堰市| 和田市| 寻甸| 肥西县| 天全县| 闽清县| 天全县| 华亭县| 密云县| 恭城| 池州市| 彰武县| 阳城县| 山阳县| 东乡县| 大冶市| 扶沟县| 墨玉县| 新余市| 汉源县| 富裕县| 琼海市|