三種分布式鎖實現方式

目錄

1、數據庫自增

2、Redis自增

3、Zookeeper

4、其他

4.1、雪花算法

4.2、Tinyid

4.3、Leaf

4.4、數據庫號段?


1、數據庫自增

利用數據庫表的自增特性,或主鍵唯一性,實現分布式ID

REPLACE INTO id_table (stub) values (’a‘) ;
SELECT LAST_INSERT_ID();

優點:

(1)單調遞增,不會影響數據庫的數據寫入性能。
(2)可讀性高。

缺點:

(1)ID生成涉及到數據庫操作,性能不高。
(2)需要額外引入中央數據庫,鏈路變長導致出錯概率增加。
(3)開發成本相對較高。
(4)數據庫壓力大。

2、Redis自增

Redis的自增命令incr生成全局唯一ID。具體實現方式是:在Redis中維護一個自增的計數器,每次生成ID時,從Redis中獲取計數器的值,然后將其加一并更新回Redis。

通過Redis的INCR自增命令來生成分布式ID。

127.0.0.1:6379> set distributed_id 1     // 將分布式ID初始化為1
OK
127.0.0.1:6379> incr distributed_id      // +1,并返回結果
(integer) 2

優點:

(1)單調遞增,不會影響數據庫的數據寫入性能。
(2)ID生成性能高。
(3)可讀性高。

缺點:

(1)需要額外引入Redis,鏈路變長導致出錯概率增加。
(2)Redis宕機后,RDB + AOF數據恢復較慢,需要Plan B提升恢復速度。
(3)開發成本相對較高。

3、Zookeeper

利用Zookeeper的順序節點特性來生成全局唯一ID。

優點:

  • 利用Zookeeper的集群特性保證高可用。

  • ID全局唯一。

缺點:

  • 需要依賴Zookeeper集群。

  • 可能會受到Zookeeper性能的限制。

  • 并發競爭較大不適合用Zookeeper

4、其他

4.1、雪花算法

雪花算法是一種生成分布式全局唯一ID的算法,生成的ID稱為Snowflake IDs。這種算法由Twitter創建,并用于推文的ID。

一個Snowflake ID有64位。

  • 第1位:Java中long的最高位是符號位代表正負,正數是0,負數是1,一般生成ID都為正數,所以默認為0。

  • 接下來前41位是時間戳,表示了自選定的時期以來的毫秒數。

  • 接下來的10位代表計算機ID,防止沖突。

  • 其余12位代表每臺機器上生成ID的序列號,這允許在同一毫秒內創建多個Snowflake ID。

Snowflake雪花算法的優點:

  • 生成的ID全局唯一、趨勢遞增。

  • 性能高,可擴展性強。

Snowflake雪花算法的缺點:

  • 需要時鐘回撥處理機制。

  • 依賴機器ID和數據中心ID的分配。

4.2、Tinyid

Tinyid是滴滴開源的輕量級分布式ID生成系統,它是基于號段模式原理實現的與Leaf如出一轍,每個服務獲取一個號段(1000,2000]、(2000,3000]、(3000,4000]

4.3、Leaf

Leaf是美團點評開源的分布式ID生成系統,包含基于數據庫和基于Zookeeper的兩種實現方式。以基于數據庫的自增ID生成策略為例(數據庫表結構):

CREATE TABLE leaf_alloc (  biz_tag VARCHAR(128) NOT NULL COMMENT '業務key',  max_id BIGINT(20) NOT NULL COMMENT '當前已分配的最大id',  step INT(11) NOT NULL COMMENT '每次id的增長步長',  PRIMARY KEY (biz_tag)  
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4;

4.4、數據庫號段?

數據庫號段,是在“數據庫自增ID”方案上做的優化,實現方式如下:

(1)從中央數據庫中獲取出一批分布式ID,并緩存到分布式ID服務本地,業務系統獲取分布式ID的時候,可直接在這個批次內遞增取值。
(2)若該批次分布式ID的號段用完,則需要更新數據庫中的初始值,再次獲取新批次的分布式ID,并重新緩存到分布式ID服務本地,以供使用。

CREATE TABLE id_generator (id int(10) NOT NULL,max_id bigint(20) NOT NULL COMMENT '當前最大id',step int(10) NOT NULL COMMENT '號段的長度',biz_type int(10) NOT NULL COMMENT '業務類型',version int(10) NOT NULL COMMENT '版本號,是一個樂觀鎖,每次都更新version,保證并發時數據的正確性',PRIMARY KEY (`id`)
)

優點:

(1)趨勢遞增,不會影響數據庫的數據寫入性能。
(2)ID生成性能高。
(3)數據庫壓力小。
(4)可讀性高。

缺點:

(1)開發成本很高。
(2)需要額外引入分布式ID服務和中央數據庫,鏈路變長導致出錯概率增加。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/36472.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/36472.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/36472.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

社交App廣告優化新篇章:Xinstall引領用戶體驗升級,助力買量效果提升

隨著移動互聯網的快速發展,社交App已經成為人們生活中不可或缺的一部分。然而,在競爭激烈的市場環境下,如何有效地進行廣告投放,吸引并留住用戶,成為了每個社交App運營者面臨的重大挑戰。今天,我們就來談談…

自費5K,測評安德邁、小米、希喂三款寵物空氣凈化器誰才是高性價比之王

最近,家里的貓咪掉毛嚴重,簡直成了一個活生生的蒲公英,家中、空氣中各處都彌漫著貓浮毛甚至所有衣物都覆蓋著一層厚厚的貓毛。令人難以置信的是,有時我甚至在摳出的眼屎中都能發現夾雜著幾根貓毛。真的超級困擾了。但其實最空氣中…

Packer-Fuzzer一款好用的前端高效安全掃描工具

★★免責聲明★★ 文章中涉及的程序(方法)可能帶有攻擊性,僅供安全研究與學習之用,讀者將信息做其他用途,由Ta承擔全部法律及連帶責任,文章作者不承擔任何法律及連帶責任。 1、Packer Fuzzer介紹 Packer Fuzzer是一款針對Webpack…

4.if 條件判斷

1.if-else語句 if #判斷條件 :pass else:pass2.if - elif- else if #判斷條件 :pass elif #判斷條件:pass else:pass3.if語句可以嵌套 if #判斷條件 :passif #判斷條件 :pass 4.邏輯運算符 and 兩個都為真,才是真 or 一個為真 即是真 not 取反 and從左到右,所有值為真,返回…

麒麟系統安裝MySQL

搞了一整天,終于搞定了,記錄一下。 一、背景 項目的原因,基于JeecgBoot開發的系統需要國產化支持,這就需要在電腦上安裝MySQL等支撐軟件。 國產化項目的操作系統多是麒麟系統,我的系統如下: arm64架構。…

C#快速開發OPCUA服務器

為方便演示,此時創建一個控制臺應用程序。第三方dll(C編寫的庫opcsrv.dll,他人實現)。 拷貝dll到運行目錄下: 拷貝二次封裝后的文件到項目目錄下: 第一步:創建OpcUa服務器 //第一步:創建OpcUa服務器 OPCSr…

java.util.Optional類介紹

java.util.Optional 是 Java 8 引入的一個容器類,用于表示可能包含或不包含非空值的對象。它的設計初衷是為了減少程序中的空指針異常(NullPointerException),并使代碼更加簡潔和易讀。 Optional 類的介紹 1. 特點 避免顯式的 null 檢查:使用 Optional 可以避免顯式的 n…

基于ssh框架的個人博客源碼

基于ssh的個人博客源碼,頁面清爽簡潔,原先有部分bug,運行不了,現已修復 1.博客首頁 (本地訪問地址 :localhost:8080/Blog/index/index) 2.關于我 3.慢生活 4.留言板 5.我的相冊 微信掃碼下載源碼

商場配電新思維:智能網關驅動的自動化管理系統

在商場配電室監控系統中,主要是以無線網絡為載體,目的就是便于對變電站等實時監測與控制。其中,4G配電網關非常關鍵,可以將配電室系統終端上的信息數據及時上傳到服務器,再由服務器下達控制指令到各模塊中,…

Oracle Database 23ai新特性之INTERVAL聚合函數增強

Oracle Database 23ai 開始 AVG 以及 SUM 函數支持 INTERVAL 數據類型,它們可以作為聚合函數或者分析函數使用。 示例表 本文將會使用以下示例表: create table t1 (id integer,start_time timestamp,end_time timestamp,duration in…

超越規模的冒險之旅:引導人工智能價值對齊

在茫茫技術之林中,人工智能憑借大模型占據了重要地位。人們已經不再局限于人機對弈和AI識圖,開始探索那些能夠模仿人類思考的機器。無論是日常聊天、文本寫作,還是[在完美的提示詞引導下創作出驚艷的詩歌],我們不得不承認AI工具已…

雙指針算法第二彈(查找總價格為目標值的兩個商品-和為s的兩個數字 三數之和 四數之和)

系列文章目錄 《雙指針算法第一彈(移動零 復寫零 快樂數)》鏈接:http://t.csdnimg.cn/Nqdvn 目錄 系列文章目錄 前言 1. 查找總價格為目標值的兩個商品 (1)題目及示例 (2)思路&#xff08…

純css寫一個動態圣誕老人

效果預覽 在這篇文章中,我們將學習如何使用CSS來創建一個生動的圣誕老人動畫。通過CSS的魔力,我們可以讓圣誕老人在網頁上搖擺,仿佛在向我們招手慶祝圣誕節和新年。 實現思路 實現這個效果的關鍵在于CSS的keyframes動畫規則以及各種CSS屬性…

想要打造高效活躍的私域社群,這些技巧要知道

對一些企業來說“做社群等于做私域”。 在騰訊提到的私域轉化場景中,社群與小程序、官方導購三者并列。 社群連接著品牌和群內用戶。品牌通過圈住更多用戶,來持續免費觸達用戶實現變現,用戶則是從品牌方手中直接獲取更多服務和優惠。那么&a…

【絕對有用】yolo系列目標檢測 核心技術點 匯總

YOLO (You Only Look Once) 是一種高效的目標檢測算法,它以速度和精度著稱。YOLO 的工作原理是將目標檢測視為一個回歸問題,直接從圖像的像素空間預測目標的類別和位置。YOLO 目標檢測頭包括以下幾個關鍵部分: 輸入圖像處理: YOLO…

云計算【第一階段(19)】磁盤管理與文件系統 LVM與磁盤配額(二)

目錄 一、LVM概述 1.1、LVM機制的基本概念 ?編輯 1.2、LVM的管理命令 1.3、lvm存儲 兩種機制 1.4、lvm應用實例 二、磁盤配額概述 2.1、設置磁盤配額 2.2.1、實現磁盤限額的條件 2.2.2、linux磁盤限額的特點 2.2.3、磁盤配額管理 一、LVM概述 1.1、LVM機制的基本概…

用Python制作一個簡單的計算器(加減乘除)

簡易計算器 寫在前面 小編用python實現了一個簡單的計算器,一起來看看吧~ 需要環境: pycharm python 一、需求分析 1.1 功能分析 使用Python的Tkinter界面設計實現一個簡單的計算器,主要功能按鈕包括數字鍵、四則運算符、等于號和清除…

JavaScript算法之龜兔賽跑

簡介:龜兔賽跑算法,又稱弗洛伊德循環檢測算法,是一種在鏈表中非常常用的算法。它基于運動學和直覺的基本定律。本文旨在向您簡要介紹該算法,并幫助您了解這個看似神奇的算法。 假設高速公路上有兩輛車。其中一輛的速度為 x,另一輛的速度為 2x。它們唯一能相遇的條件是它們…

[MYSQL] MYSQL表的操作

前言 由圖可以看出,表是庫的一部分,所以有庫才能使用表 show databases; 查看已有的庫 create database db_name ; 創建庫 使用 use bd_name 使用庫,之后對標進行增刪查改就只會操作這個庫里的而不影響其他庫 創建表 create table [if not exists] table_name( d…

MySQL周內訓參照3、簡單查詢與多表聯合復雜查詢

基礎查詢 1、查詢用戶信息,僅顯示用戶的姓名與手機號,用中文顯示列名。中文顯示姓名列與手機號列 SELECT user_id AS 編號, phone AS 電話 FROM user; 2. 根據訂購表進行模糊查詢,模糊查詢需要可以走索引,需要給出explain語句。…