三种分布式锁实现方式

目录

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.mzph.cn/diannao/36472.shtml

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

相关文章

社交App广告优化新篇章:Xinstall引领用户体验升级,助力买量效果提升

随着移动互联网的快速发展,社交App已经成为人们生活中不可或缺的一部分。然而,在竞争激烈的市场环境下,如何有效地进行广告投放,吸引并留住用户,成为了每个社交App运营者面临的重大挑战。今天,我们就来谈谈…

自费5K,测评安德迈、小米、希喂三款宠物空气净化器谁才是高性价比之王

最近,家里的猫咪掉毛严重,简直成了一个活生生的蒲公英,家中、空气中各处都弥漫着猫浮毛甚至所有衣物都覆盖着一层厚厚的猫毛。令人难以置信的是,有时我甚至在抠出的眼屎中都能发现夹杂着几根猫毛。真的超级困扰了。但其实最空气中…

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

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与学习之用,读者将信息做其他用途,由Ta承担全部法律及连带责任,文章作者不承担任何法律及连带责任。 1、Packer Fuzzer介绍 Packer Fuzzer是一款针对Webpack…

麒麟系统安装MySQL

搞了一整天,终于搞定了,记录一下。 一、背景 项目的原因,基于JeecgBoot开发的系统需要国产化支持,这就需要在电脑上安装MySQL等支撑软件。 国产化项目的操作系统多是麒麟系统,我的系统如下: arm64架构。…

C#快速开发OPCUA服务器

为方便演示,此时创建一个控制台应用程序。第三方dll(C编写的库opcsrv.dll,他人实现)。 拷贝dll到运行目录下: 拷贝二次封装后的文件到项目目录下: 第一步:创建OpcUa服务器 //第一步:创建OpcUa服务器 OPCSr…

基于ssh框架的个人博客源码

基于ssh的个人博客源码,页面清爽简洁,原先有部分bug,运行不了,现已修复 1.博客首页 (本地访问地址 :localhost:8080/Blog/index/index) 2.关于我 3.慢生活 4.留言板 5.我的相册 微信扫码下载源码

商场配电新思维:智能网关驱动的自动化管理系统

在商场配电室监控系统中,主要是以无线网络为载体,目的就是便于对变电站等实时监测与控制。其中,4G配电网关非常关键,可以将配电室系统终端上的信息数据及时上传到服务器,再由服务器下达控制指令到各模块中,…

超越规模的冒险之旅:引导人工智能价值对齐

在茫茫技术之林中,人工智能凭借大模型占据了重要地位。人们已经不再局限于人机对弈和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语句。…

【区间动态规划】1771. 由子序列构造的最长回文串的长度

本文涉及知识点 动态规划汇总 LeetCode1771. 由子序列构造的最长回文串的长度 给你两个字符串 word1 和 word2 ,请你按下述方法构造一个字符串: 从 word1 中选出某个 非空 子序列 subsequence1 。 从 word2 中选出某个 非空 子序列 subsequence2 。 连…

企业AI落地的大法器-用数据清洗手段提升数据质量,找回遗珠之光

开篇 书接上文,在上文《谈LORA微调与数据质量处理之争》中我们详细叙述了:LORA微调手段和数据清洗之分,以及如何平衡和组合使用LORA微调与数据清洗的手法。 文末我们提到了“下一篇我们讲着重讲述:在打造企业数据清洗工具、平台…

003 SpringBoot操作ElasticSearch7.x

文章目录 5.SpringBoot集成ElasticSearch7.x1.添加依赖2.yml配置3.创建文档对象4.继承ElasticsearchRepository5.注入ElasticsearchRestTemplate 6.SpringBoot操作ElasticSearch1.ElasticsearchRestTemplate索引操作2.ElasticsearchRepository文档操作3.ElasticsearchRestTempl…