三种分布式锁实现方式

目录

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.mfbz.cn/a/751558.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

4A的「A」会变成AI的「A」吗?

戛纳国际创意节上,广告集团WPP的全球CEO Mark Read 和英国CEO Karen Blackett 解释了WPP如何应对AIGC所带来的「威胁」。同时,Mark Read 与Elon Musk对话,讨论「技术创新的变革力量,人工智能如何重塑创造力、商业和社会&#xff0…

Ueditor中集成135编辑器

一、背景 在资讯项目平台运营过程中,资讯需要排版,一般都是在135编辑器排好以后,复制到平台中UEditor编辑器中,所以,他们建议集成一下135哈 二、了解135编辑器 开始调研了解135编辑器,发现人家就支持集成…

PVE 8.2.2安装OpenWrt 23.05.3

1,下载官方openwrt 23.5.3镜像并解压 2,进入pve上传镜像 复制这段文字之后需要使用 创建虚拟机 删除磁盘 安装完毕后 shell 运行 qm importdisk 100 /var/lib/vz/template/iso/openwrt-23.05.3-x86-64-generic-ext4-combined-efi.img local-lvm 其中100是虚拟…

mac菜单栏应用管理软件:Bartender 4 for Mac 中文激活版

Bartender 4 是一款由Bearded Men Games开发的适用于Mac操作系统的应用程序,它被设计用来优化和美化Mac菜单栏的功能。自从macOS Big Sur开始,Mac的菜单栏可以自定义,用户可以添加和移除各种图标。Bartender 4就是在这个背景下应运而生&#…

Spring Boot中获取请求参数的几种方式

前言 在构建现代 Web 应用时,处理来自客户端的请求参数是不可或缺的一部分。Spring Boot作为构建微服务应用的领先框架,提供了多种灵活高效的方式来获取请求参数,满足各种应用场景。 无论您是Spring Boot的初学者,还是希望更深入…

[分布式网络通讯框架]----Protobuf安装配置--附带每一步截图

Protobuf Protobuf(Protocol Buffers)协议是一种由 Google 开发的二进制序列化格式和相关的技术,它用于高效地序列化和反序列化结构化数据,通常用于网络通信、数据存储等场景。 为什么要使用Protobuf Protobuf 在许多领域都得到…

【PL理论深化】(8) Ocaml 语言:元组和列表 | 访问元组中的元素 | 列表中的 head 和 tail | 基本列表操作符

💬 写在前面:本章我们将探讨 OCaml 中的元组(tuple)和列表(list),它们是函数式编程语言中最常用的数据结构。 目录 0x00 元组(Tuple) 0x01 访问元组中的元素 0x02 列表&…

电脑开机之后,键盘鼠标需要重新插拔才能正常使用?

前言 小白平时修电脑修得多,总是会遇到各种各样的奇葩问题。这不,又有一位小伙伴来咨询:电脑开机之后,键盘鼠标都不能用,需要重新插拔一下才能正常使用。 啧啧啧,真的是很奇怪的问题,基本上没见…

OpenCV报错已解决:Vector析构异常OpencvAssert CrtlsValidHeapPointer

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引入 在使用OpenCV进行图像处理时,我们可能会遇到Vector析构异常OpencvAssert CrtlsValidHeapPointer的问题。本文将…

Kubernetes之 资源管理

系列文章目录 Kubernetes之 资源管理 文章目录 系列文章目录前言一、资源管理介绍二、YAML语言介绍 1.1.YAML语法:2.读入数据总结 一、资源管理介绍 在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes。 1. kub…

深度解析RocketMq源码-IndexFile

1.绪论 在工作中,我们经常需要根据msgKey查询到某条日志。但是,通过前面对commitLog分析,producer将消息推送到broker过后,其实broker是直接消息到达broker的先后顺序写入到commitLog中的。我们如果想根据msgKey检索一条消息无疑…

如何理解AKM?

关于Wi-Fi的加密认证过程,我们前面已经讲解:WLAN数据加密机制_tls加密wifi-CSDN博客 今天我们来理解下AKM,AKM(Authentication and Key Management)在Wi-Fi安全中是指认证和密钥管理协议。它是用于确定Wi-Fi网络中的认…

Linux学习第54天:Linux WIFI 驱动:蓝星互联

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 数字化、现代化的今天,随处的WIFI给与了大众极大的方便,也感受到了科技的力量。万物互联、无线互联越来越成为一个不可逆转的趋势。现在比较火…

ISP IC/FPGA设计-第一部分-SC130GS摄像头分析(0)

1.介绍 SC130GS是一款国产的Global shutter CMOS图像传感器,最高支持1280Hx1024V240fps的传输速率;SC130GS有黑白和彩色款,作为ISP开发选择彩色的,有效像素窗口为1288Hx1032V,支持复杂的片上操作,选择他理…

谈谈WebComponents | 前端开发

一、 源起 让我们以一个例子开始。 假设我们要做一个环形进度条,它可以: 1、根据进度数值的不同,计算出百分比,以渲染对应的角度值。 2、根据设置的进度不同,我们用不同的颜色加以区分。 3、在环的中间我们以动画递增的…

基于RabbitMQ的异步消息传递:发送与消费

引言 RabbitMQ是一个流行的开源消息代理,用于在分布式系统中实现异步消息传递。它基于Erlang语言编写,具有高可用性和可伸缩性。在本文中,我们将探讨如何在Python中使用RabbitMQ进行消息发送和消费。 安装RabbitMQ 在 Ubuntu 上安装 Rabbi…

wps的domain转为shp矢量

wps的namelist制作、python出图和转矢量 简介 wps(WRF Preprocessing System)是中尺度数值天气预报系统WRF(Weather Research and Forecasting)的预处理系统。 wps的安装地址在GitHub上:https://github.com/wrf-model/WPS 下载完成后&…

注册中心不知选哪个?Zookeeper、Eureka、Nacos、Consul和Etcd 5种全方位剖析对比

本文给大家讲解 5 种常用的注册中心,对比其流程和原理,无论是面试还是技术选型,都非常有帮助。 对于注册中心,在写这篇文章前,我其实只对 ETCD 有比较深入的了解,但是对于 Zookeeper 和其他的注册中心了解甚…

pytorch统计学分布

1、pytorch统计学函数 import torcha torch.rand(2,2) print(a) print(torch.sum(a, dim0)) print(torch.mean(a, dim0)) print(torch.prod(a, dim0))print(torch.argmax(a, dim0)) print(torch.argmin(a, dim0)) print(torch.std(a)) print(torch.var(a)) print(torch.median…

AI进阶指南第四课,大模型优缺点研究?

在上一篇文章中,我主要探讨了LM模型与企业级模型的融合。 但是,在文末对于具体的大模型优缺点只是简单地说明了一下,并不细致。 因此,在这一节,我将更为细致地说明一下大模型的优缺点。 一,隐私安全 将L…