三种分布式锁实现方式

news2024/9/20 16:27:20

目录

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.coloradmin.cn/o/1870380.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Adobe Indesign 操作

页面设计 页面设置 版面:图文和空白部分的总和。 版心:规划在版面中排印文本和图片的部分。 开本:单个页面的宽度和高度。 如图所示,新建文件,自定义是210297毫米。这个数据是开本大小。 点击“边距和分栏”&#…

Redis-主从复制-测试主从模式下的读写操作

文章目录 1、在主机6379写入数据2、在从机6380上写数据报错3、从机只能读数据,不能写数据 1、在主机6379写入数据 127.0.0.1:6379> keys * (empty array) 127.0.0.1:6379> set uname jim OK 127.0.0.1:6379> get uname "jim" 127.0.0.1:6379>…

入职必备-mac下载安装maven

1、Maven 下载 1.1、官网下载安装包 官网下载链接 历史版本下载: Index of /dist/maven/maven-3/3.8.8/binaries 注意 .bash_profile 文件中的符号可能会影响配置 1.2、解压文件 2、Maven 环境配置 2.1、Java JDK 依赖 配置 maven 环境变量需要先配置好 JDK …

指纹浏览器是什么?跨境多账号安全如何保证?

随着电子商务的蓬勃发展,越来越多的商家选择开设多店来扩大经营规模。然而多店运营也带来了一系列的挑战,其中之一就是账号安全。 1. 了解反检测浏览器和代理服务器 在我们开始讨论如何有效地使用反检测浏览器之前,我们首先需要了解这两个工…

【ajax实战02】数据管理网站—验证码登录

一:数据提交(提交手机验证码) 核心思路整理 利用form-serialize插件,收集对象形式的表单数据后,一并提交给服务器。后得到返回值,进一步操作 基地址: axios.defaults.baseURL http://geek.…

3d模型材质吸不了什么原因?怎么解决?---模大狮模型网

3D模型无法吸取材质可能有以下原因: 文件格式不支持:某些文件格式(如STL)不支持嵌入材质信息,因此在导入此类文件后,需要手动为模型添加材质。 材质链接错误:如果模型文件中嵌入了材质信息,但是链接错误&a…

WiFi模块ESP8266同阿里物联网云平台连接(超详细)

写在前面:本节主要的内容是利用ESP8266模块,同阿里云物联网平台的连接,为后面的实现数据的远程展示与处理做好铺垫。 本节的主要内容分为一下几个阶段进行: 1、阿里云物联网平台的创建2、阿里云 IOT studio界面绘制3、mqtt.fx软件…

浅谈逻辑控制器之仅一次控制器

浅谈逻辑控制器之仅一次控制器 “仅一次控制器”(Once Only Controller) 是一个非常实用的组件,它允许用户控制测试计划中的某些操作仅执行一次,无论其所在的线程组或父级控制器设置了多少次循环。本指南将详细介绍“仅一次控制器”的功能、使用场景及配…

2024欧洲杯来啦!这个AI网站预测还挺准;10条Prompt包你测出AI视频工具的成色;AI搜索版「苦涩的教训」入行必学 | ShowMeAI日报

👀日报&周刊合集 | 🎡ShowMeAI官网 | 🧡 点赞关注评论拜托啦! 1. 2024年欧洲杯来了!AI预测比赛结果的玩法,也越来越高级了~ 2024 年欧洲杯于6月14日至7月14日在德国举行,共有24支国家队参加…

flash申请内存失败,导致老化问题解决

背景 在闪光灯初始化阶段客制化了一个buffer,下发到kernel的闪光灯驱动中用于保存读取闪光灯寄存器的值。功能测试都是正常的,但是一旦开始批量跑产线老化测试会有1/4500左右概率的后主摄拍照卡住。定位根因是闪光灯初始化失败,进一步原因就…

vant4的组件气泡弹出框van-popover,在列表中遍历后点击一个全部/显示隐藏,解决办法

环境&#xff1a;vue3 vant-ui4 <div v-for"(info, index) in item.infoListVOs" :key"index"><van-popoverv-model:show"showPopover":actions"actions"overlayplacement"bottom-end"select"onSelect(info…

vector的自实现(迭代器失效问题)与继承续讲

引子&#xff1a;在生活中&#xff0c;我们使用vector很频繁&#xff0c;我们是不是可以自己来实现一个呢&#xff1f;&#xff0c;其实也不难&#xff0c;我们在学过数据结构&#xff0c;就很easy啦&#xff01; As we all kowmn,vector基础有以下函数&#xff01; from my …

GMSB文章五:微生物组差异分析ANCOMBC-2

欢迎大家关注全网生信学习者系列&#xff1a; WX公zhong号&#xff1a;生信学习者Xiao hong书&#xff1a;生信学习者知hu&#xff1a;生信学习者CDSN&#xff1a;生信学习者2 介绍 微生物的物种差异分析是一项关键的生物信息学任务&#xff0c;旨在识别不同生物群落或样本组…

k-NN 剪辑近邻法

本篇文章是博主在人工智能等领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在AI学习笔记&#…

基于halcon的眼在手外(Eye-to-Hand)标定

前言 上个月写了一个《基于halcon的眼在手上&#xff08;Eye-in-Hand&#xff09;标定》的文章&#xff0c;通过官方的示例代码进行了简单的叙述&#xff0c;想学习的小伙伴可以点击链接进行学习。之前博主认为眼在手上&#xff08;Eye-in-Hand&#xff09;的案例更多&#xff…

【Java笔记】Flyway数据库管理工具的基本原理

文章目录 1. 工作流程2. 版本号校验算法3. 锁机制3.1 为什么数据库管理工具需要锁3.2 flyway的锁机制 Reference 最近实习做的几个项目都用到了Flyway来做数据库的版本管理&#xff0c;顺便了解了下基本原理&#xff0c;做个记录。 详细的使用就不写了&#xff0c;网上教程很多…

【财经研究】并购重组的“不可能三角”

伴随着沪深IPO景气度下滑后&#xff0c;并购重组正受到市场的关注。 近期监管层正频频为并购重组发声 6月20日&#xff0c;证监会主席吴清在陆家嘴论坛上指出&#xff1a;“支持上市公司运用各种资本市场工具增强核心竞争力&#xff0c;特别是要发挥好资本市场并购重组主渠道作…

干涉阵型成图参数记录【robust】

robust 这个玩意经常忘记&#xff0c;就是取2的时候是更加显示大尺度的结构&#xff0c;取-2更加显示小尺度结果&#xff0c;一般取0就是正常就好了

高效同步的PWM升压DC/DC转换器 SD6201/SD6201-AF

SD6201是高效同步的PWM升压DC/DC转换器优化为介质提供高效的解决方案电力系统。这些设备在输入电压介于0.9V和4.4V之间&#xff0c;带有1.4MHz固定频率切换。这些功能通过允许使用小型、薄型电感器以及陶瓷电容器。自动PWM/PFM轻负载下的模式切换可节省电力提高了效率。电压在2…

IMU坐标系与自定义坐标系转化

1.首先示例图为例&#xff1a; 虚线黑色角度为IMU的坐标系&#xff1b;实线为自定义坐标系&#xff1b; 矫正&#xff1a;&#xff08;默认angleyaw为IMU采的数据角度&#xff09; angleyaw_pt angleyaw-25;if(-180<angleyaw&&angleyaw<-155) // 角度跳变问…