在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

數據庫如何實現分布式鎖

科技綠洲 ? 來源:Java技術指北 ? 作者:Java技術指北 ? 2023-10-08 16:12 ? 次閱讀

1. 前言

分布式應用中,有時我們需要一個方法在同一時間只能被一個線程執行。此時我們有可能會使用到分布式鎖。

分布式鎖需要具備以下特征:

  • 互斥性 同一時刻鎖只能被一個線程持有。
  • 超時釋放 超時釋放主要是用來避免死鎖,防止不必要的線程等待和資源浪費
  • 可重入性 一個線程在持有鎖的情況下,可以再次請求加鎖
  • 高性能,高可用 加鎖釋放鎖的操作盡量使用更少的資源,提高性能。同時也要保證高可用,防止分布式鎖意外失效

目前比較多的分布式鎖有下面的方案:

  • 基于數據庫實現分布式鎖
  • 基于緩存(redis, Hazelcast)等實現分布式鎖
  • 基于Zookeeper實現分布式鎖

2. 數據庫分布式鎖

2.1基于表記錄的分布式鎖

在數據庫中創建一個鎖表,并且在需要的字段上創建唯一索引,使用鎖的時候就插入數據,插入成功則獲得鎖,執行結束后,就刪除數據。也可以加上version控制,使之成為樂觀鎖。

  • 獲取鎖:成功插入數據
  • 執行業務邏輯
  • 釋放鎖:刪除數據

2.2基于數據庫行鎖的分布式鎖

使用select * For update來獲取數據庫數據鎖, where之后的條件加入唯一索引,則表示使用了行鎖。其分布式鎖使用順序如下。

  • 獲取鎖:SELECT * FROM database_lock WHERE id = 1 FOR UPDATE;。
  • 執行業務邏輯。
  • 釋放鎖:COMMIT。

3 Zookeeper分布式鎖

Zookeepe可以實現分布式鎖主要是因為多個線程去Zookpeeper中創建同一個節點時,只有一個線程可以創建成功。

Zookeeper中有臨時節點,持久化節點。其中臨時節點在服務端session失效后,節點就會被刪除。相對而言,持久化節點在服務端session失效后,也不會被刪除,而是需要客戶端主動刪除。

在上述類型系節點之后增加一個數字后綴,即路徑+數字后綴,這樣可以保證其唯一性和有序性。

其分布式鎖實現原理如下:

  • 創建一個lock目錄給分布式鎖使用
  • 某個線程想要獲取鎖就在此目錄下創建臨時順序節點
  • 獲取此目錄下的所有子節點,然后查找比自己序號小的節點,如果不存在,則當前線程創建的節點是最小節點,此時獲得鎖。
  • 其他線程想要獲取鎖,同樣是創建臨時有序節點,如果是最小序號節點則獲得鎖,否則監聽比自己小的次小節點。
  • 持有分布式鎖的線程操作完成之后,刪除自己的臨時節點,次大節點監聽到變更事件之后,判斷自己是最小序號節點的話,則獲得鎖。

Zookeeper實現分布式鎖具有高可用,可重入,阻塞等特點,由于臨時節點在客戶端斷開的時候就會被自動刪除,所以不用擔心死鎖問題。但是頻繁刪除和創建節點,性能上會比Redis分布式鎖低。

4 Redis分布式鎖

4.1 SETNX

setnx命令只會在key不存在的情況下將key設置為value值, 其中key和 value值均可以設置成和業務相關的的命名。但是不滿足超時釋放的要求。

如果使用expire設置過期時間,也有可能在setnx成功后,由于各種原因,expire沒有執行成功,從而導致鎖不能超時釋放。

4.2 SETNX 擴展命令

set key value [EX seconds] [PX milliseconds] [NX|XX]
 #EX 設置過期時間,單位為秒  set lock VALUE EX 10
 #PX 設置過期時間,單位為毫秒 set lock VALUE PX 10000
 #NX key不存在時才設置key的值  set lock VALUE EX 10 NX
 #XX key存在時才設置key SET lock VALUE EX 10 XX

set 擴展命令可以完全取代 SETNX, SETEX, PSETEX 等功能。

可以使用set擴展功能完成設置過期時間, 并且是原子操作。

上述分布式鎖也有一些問題:

  • 如果線程獲取鎖之后,執行時間過長,鎖提前釋放。
  • 如果線程A未執行完操作,鎖超時釋放,此時線程B又獲取了鎖。線程B持有鎖,但是A線程有可能執行DEL操作釋放鎖。

需要避免在長時間執行的任務中使用上述分布式鎖,而且未按時執行完的線程不影響其最終結果。另外可以在鎖的value設置一些唯一值,刪除key之前驗證是否持有鎖。并且驗證和刪除需要使用Lua腳本保證其刪除操作的原子性。

上述分布式鎖還需要解決一個可重入性的問題。

4.3 Redisson 分布式鎖

Redisson是基于Redis的Java內存數據網格,充分利用了Redis鍵值數據庫提供的一系列優勢。同時提供功能豐富的分布式鎖。

Resisson內部會有一個監控鎖的守護線程,在redisson實例被關閉前,不斷延長鎖的有效期。并且可以自定義超時檢查時間間隔,同時還可以指定加鎖時間。另外還支持公平鎖(Fair Lock),聯鎖(MultiLock),紅鎖(RedLock),讀寫鎖(ReadWriteLock)以及RSemaphore和RCountDownLatch等類似Java提供的各種多線程工具等。

其中RedLock是基于多個Redis集群關聯的鎖,可以大大提高鎖的可用性及安全性。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    7232

    瀏覽量

    90693
  • 數據庫
    +關注

    關注

    7

    文章

    3879

    瀏覽量

    65516
  • 分布式
    +關注

    關注

    1

    文章

    969

    瀏覽量

    75060
  • 線程
    +關注

    關注

    0

    文章

    507

    瀏覽量

    20009
  • 服務端
    +關注

    關注

    0

    文章

    68

    瀏覽量

    7159
收藏 0人收藏

    評論

    相關推薦

    分布式軟件系統

    降到最低。負載在各處理機之間分擔,可以避免臨界瓶頸。 4、當現有機構中已存在幾個數據庫系統,而且實現全局應用的必要性增加時,就可以由這些數據庫自下而上構成分布式數據庫系統。 5、相等規
    發表于 07-22 14:53

    小白求教:labview連接分布式數據庫

    我用Hadoop搭建了一個分布式數據庫,想讓labview作為client向數據庫中寫數據,應該怎么實現
    發表于 12-13 10:18

    分布式數據庫有什么優缺點?

    分布式數據庫系統(DDBS)是數據庫技術和網絡技術兩者相互滲透和有機結合的結果。涉及數據庫基本理論和網絡通信理論。分布式數據庫由一組數據組成
    發表于 09-24 09:13

    HarmonyOS分布式數據庫,為啥這么牛?

    和維護,這個對于應用開發是非常友好的。 HarmonyOS 系統級的數據庫同步,讓開發者省去了同步管理、數據收發控制、數據一致性解決等問題的解決,讓開發者能夠更迅速的
    發表于 11-19 15:38

    【木棉花】分布式數據庫

    同步,為用戶提供在多種終端設備上一致的數據訪問體驗。” 那通俗易懂的來講就是分布式數據庫除了可以存儲數據,還是可以讓多臺設備共用一個數據庫,它和輕量級偏好
    發表于 09-05 10:43

    分布式數據庫,什么是分布式數據庫

    分布式數據庫,什么是分布式數據庫 分布式數據庫系統是在集中式數據庫系統成熟技術的基礎上發展起來的,但不是簡單地把集中式數
    發表于 03-18 15:25 ?3988次閱讀

    分布式數據庫控制協調體系結構的研究與實現

    分布式數據庫控制協調體系結構的研究與實現_李海榮
    發表于 01-07 20:43 ?0次下載

    Redis 分布式的正確實現方式

    分布式一般有三種實現方式:1. 數據庫樂觀;2. 基于Redis的分布式
    的頭像 發表于 05-31 14:19 ?3712次閱讀

    為什么我們需要分布式數據庫

    to be database systems.)” 數據庫系統經過幾十年演進后,分布式數據庫在近幾年發展如火如荼,國內外出現了很多分布式數據庫創業公司,為什么分布式數據庫開始流行?在
    的頭像 發表于 09-06 10:37 ?2702次閱讀

    數據庫如何走向分布式

    to be database systems.)” 數據庫系統經過幾十年演進后,分布式數據庫在近幾年發展如火如荼,國內外出現了很多分布式數據庫創業公司,為什么分布式數據庫開始流行?在
    的頭像 發表于 09-24 14:25 ?4090次閱讀
    <b class='flag-5'>數據庫</b>如何走向<b class='flag-5'>分布式</b>

    **分布式數據庫|數據庫數據類型**

    分布式數據庫是一種存儲在不同物理位置的數據庫。與單個數據庫系統的并行系統不同,分布式數據庫系統由不共享物理組件的松耦合站組成。分布式數據庫
    的頭像 發表于 07-17 13:33 ?697次閱讀

    深入理解redis分布式

    系統不同進程共同訪問共享資源的一種實現。如果不同的系統或同一個系統的不同主機之間共享了某個臨界資源,往往需要互斥來防止彼此干擾,以保證一致性。 業界流行的分布式
    的頭像 發表于 10-08 14:13 ?1126次閱讀
    深入理解redis<b class='flag-5'>分布式</b><b class='flag-5'>鎖</b>

    tldb提供分布式使用方法

    前言:分布式分布式系統中一個極為重要的工具。目前有多種分布式的設計方案,比如借助 redis,mq,
    的頭像 發表于 11-02 14:44 ?1082次閱讀
    tldb提供<b class='flag-5'>分布式</b><b class='flag-5'>鎖</b>使用方法

    分布式的三種實現方式

    ,下面將分別介紹三種常見的實現方式。 一、基于數據庫實現分布式分布式系統中,
    的頭像 發表于 12-28 10:01 ?1091次閱讀

    分布式云化數據庫有哪些類型

    分布式云化數據庫有哪些類型?分布式云化數據庫主要類型包括:關系型分布式數據庫、非關系型分布式數據庫
    的頭像 發表于 01-15 09:43 ?307次閱讀
    主站蜘蛛池模板: 欧美精品一区在线看 | 喷潮白浆直流在线播放 | 久久国产影视 | 亚洲伊人成综合成人网 | 69pao强力打造免费高清 | 天天弄天天操 | 国产卡一卡2卡三卡免费视频 | 欧亚精品卡一卡二卡三 | 午夜三级理论在线观看视频 | 理论片久久 | 丁香婷婷综合五月综合色啪 | 天天看人体 | 国产乱码精品一区二区三区四川人 | 欧美日韩一区二区三区视频 | 奇米影视777狠狠狠888不卡 | 这里只有精品视频 | 美女扒开尿口让男人桶 | 手机在线你懂的 | 久久精品国产99精品国产2021 | 日韩欧美国产电影 | 久久精品午夜视频 | 一久久 | 国产高清一区二区三区四区 | 国产激烈无遮挡免费床戏视频 | 在线观看高清免费播放 | 天天爱天天爽 | 亚洲春色在线 | 日本特黄视频 | 午夜在线免费观看视频 | 亚洲在线a | 美女福利在线观看 | 亚洲国产成人精品久久 | 久久免费精品国产72精品剧情 | 亚洲综合色网站 | 成人一二 | 精品黄色录像 | 日韩天堂| 天天干夜夜噜 | 丁香六月纪婷婷激情综合 | 黄色永久免费 | 欧美三级在线免费观看 |

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品