亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

分布式鎖三種實現方式:

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是一個為分布式應用提供一致性服務的開源組件,它內部是一個分層的文件系統目錄樹結構,規(guī)定同一個目錄下只能有一個唯一文件名?;赯ooKeeper實現分布式鎖的步驟如下:

(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 > 緩存 > 數據庫

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

相關文章

  • muduo源碼分析之TcpServer模塊詳細介紹

    muduo源碼分析之TcpServer模塊詳細介紹

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

    淺談Redis中bind的坑

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

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

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

    Redis之常用數據結構哈希表

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

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

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

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

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

    基于redis集群設置密碼的實例

    今天小編就為大家分享一篇基于redis集群設置密碼的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • 關于Redis網絡模型的源碼詳析

    關于Redis網絡模型的源碼詳析

    這篇文章主要給大家介紹了關于Redis網絡模型的源碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者使用Redis具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2020-07-07
  • 詳解Redis開啟遠程登錄連接

    詳解Redis開啟遠程登錄連接

    本篇文章主要介紹了Redis開啟遠程登錄連接,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Redis中set類型實現交集并集差集

    Redis中set類型實現交集并集差集

    本文主要介紹了Redis中set類型實現交集并集差集,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06

最新評論