浅析分布式ID生成算法(UUID、Snowflake、Leaf)

简介: 浅析分布式ID生成算法(UUID、Snowflake、Leaf)

一、雪花算法



1、雪花算法简介

     

SnowFlake 算法,是 Twitter 开源的分布式 id 生成算法。其核心思想就是:使用一个 64 bit的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛,且ID 引入了时间戳,基本上是保持自增的。

       

由于在Java中64bit的整数是long类型,所以在Java中SnowFlake算法生成的id就是long来存储的。


2、雪花算法生成ID的结构

9e3a38cbbc7a43af97b109aa975a142c.png

1、1bit,不用,因为二进制中最高位是符号位,1表示负数,0表示正数。生成的id一般都是用整数,所以最高位固定为0。


2、41bit-时间戳,用来记录时间戳,毫秒级。

- 41位可以表示 (2^41-1) 个数字,

- 如果只用来表示正整数(计算机中正数包含0),可以表示的数值范围是:0 至 2^41-1 ,减1是因为可表示的数值范围是从0开始算的,而不是1。

- 也就是说41位可以表示 2^41-1 个毫秒的值,转化成单位年则是69年


3、10bit-工作机器id,用来记录工作机器id。

 - 可以部署在 2^10=1024 个节点,包括5位datacenterId和5位workerId

- 5位(bit)可以表示的最大正整数是 2^5-1=31 ,即可以用0、1、2、3、....31这32个数字,来表示不同的datecenterId或workerId


4、12bit-序列号,序列号,用来记录同毫秒内产生的不同id。

- 12位(bit)可以表示的最大正整数是 2^12-1=4095 ,即可以用0、1、2、3、....4094这4095个数字,来表示同一机器同一时间截(毫秒)内产生的4095个ID序号。


3、雪花算法能够保证


(1)所有生成的id按时间趋势递增


(2)整个分布式系统内不会产生重复id(因为有datacenterId和workerId来做区分)


4、雪花算法优缺点


优点:


(1)高性能高可用:生成时不依赖于数据库,完全在内存中生成。

(2)容量大:每秒中能生成数百万的自增ID。

(3)ID自增:存入数据库中,索引效率高。


缺点:


(1)依赖与系统时间的一致性,如果系统时间被回调,或者改变,可能会造成id冲突或者重复。

(2)不一定是全局递增的


5、雪花算法的优化——时钟回拨问题

     

保存过去一段时间内每一台机器在当前这一毫秒产生的ID的最大值,比如使用Map形式,就是<machine_id,max_id>,这样如果某台机器发生了时钟回拨,直接在这台机器对应的max_id的基础上继续自增生成ID即可。


6、源码


参考:雪花算法的原理和实现Java_雨夜青草的博客-CSDN博客_雪花算法


二、UUID



1、UUID简介


UUID(Universally Unique Identifier)的标准型式包含32个16进制数字,以连字号分为五段,形式为8-4-4-4-12的36个字符,示例:550e8400-e29b-41d4-a716-446655440000,到目前为止业界一共有5种方式生成UUID,详情见IETF发布的UUID规范 A Universally Unique IDentifier (UUID) URN Namespace。  


2、UUID的优缺点


优点:    

(1)性能非常高:本地生成,没有网络消耗。

     

缺点:

(1)不易于存储:UUID太长,16字节128位,通常以36长度的字符串表示,很多场景不适用;

(2)信息不安全:基于MAC地址生成UUID的算法可能会造成MAC地址泄露,这个漏洞曾被用于寻找梅丽莎病毒的制作者位置。

(3)ID作为主键时在特定的环境会存在一些问题,比如做DB主键的场景下,UUID就非常不适用:


1、MySQL官方有明确的建议主键要尽量越短越好[4],36个字符长度的UUID不符合要求。 4c22322ea27f47c4b3178032a98ae18d.png


2、对MySQL索引不利:如果作为数据库主键,在InnoDB引擎下,UUID的无序性可能会引起数据位置频繁变动,严重影响性能。


三、Leaf




参考:Leaf——美团点评分布式ID生成系统 - 美团技术团队

       9种分布式ID生成之美团(Leaf)实战_程序员内点事-CSDN博客_leaf 美团


相关:一口气说出 9种 分布式ID生成方式,面试官有点懵了


相关文章
|
21小时前
|
消息中间件 算法 分布式数据库
Raft算法:分布式一致性领域的璀璨明珠
【4月更文挑战第21天】Raft算法是分布式一致性领域的明星,通过领导者选举、日志复制和安全性解决一致性问题。它将复杂问题简化,角色包括领导者、跟随者和候选者。领导者负责日志复制,确保多数节点同步。实现细节涉及超时机制、日志压缩和网络分区处理。广泛应用于分布式数据库、存储系统和消息队列,如Etcd、TiKV。其简洁高效的特点使其在分布式系统中备受青睐。
|
21小时前
|
算法 分布式数据库
Paxos算法:分布式一致性的基石
【4月更文挑战第21天】Paxos算法是分布式一致性基础,由Leslie Lamport提出,包含准备和提交阶段,保证安全性和活性。通过提案编号、接受者和学习者实现,广泛应用于分布式数据库、锁和配置管理。其简单、高效、容错性强,影响了后续如Raft等算法,是理解分布式系统一致性关键。
|
21小时前
|
SQL 算法
基于若依的ruoyi-nbcio流程管理系统修改代码生成的sql菜单id修改成递增id(谨慎修改,大并发分布式有弊端)
基于若依的ruoyi-nbcio流程管理系统修改代码生成的sql菜单id修改成递增id(谨慎修改,大并发分布式有弊端)
11 1
|
21小时前
|
算法
【免费】基于ADMM算法的多微网电能交互分布式运行策略(matlab代码)
【免费】基于ADMM算法的多微网电能交互分布式运行策略(matlab代码)
|
21小时前
|
算法 Serverless 调度
基于分布式ADMM算法的考虑碳排放交易的电力系统优化调度研究(matlab代码)
基于分布式ADMM算法的考虑碳排放交易的电力系统优化调度研究(matlab代码)
|
21小时前
|
算法 关系型数据库 MySQL
Go语言中的分布式ID生成器设计与实现
【5月更文挑战第6天】本文探讨了Go语言在分布式系统中生成全局唯一ID的策略,包括Twitter的Snowflake算法、UUID和MySQL自增ID。Snowflake算法通过时间戳、节点ID和序列号生成ID,Go实现中需处理时间回拨问题。UUID保证全局唯一,但长度较长。MySQL自增ID依赖数据库,可能造成性能瓶颈。选择策略时需考虑业务需求和并发、时间同步等挑战,以确保系统稳定可靠。
115 0
|
21小时前
|
算法 数据安全/隐私保护 计算机视觉
基于二维CS-SCHT变换和LABS方法的水印嵌入和提取算法matlab仿真
该内容包括一个算法的运行展示和详细步骤,使用了MATLAB2022a。算法涉及水印嵌入和提取,利用LAB色彩空间可能用于隐藏水印。水印通过二维CS-SCHT变换、低频系数处理和特定解码策略来提取。代码段展示了水印置乱、图像处理(如噪声、旋转、剪切等攻击)以及水印的逆置乱和提取过程。最后,计算并保存了比特率,用于评估水印的稳健性。
|
21小时前
|
算法 计算机视觉
基于高斯混合模型的视频背景提取和人员跟踪算法matlab仿真
该内容是关于使用MATLAB2013B实现基于高斯混合模型(GMM)的视频背景提取和人员跟踪算法。算法通过GMM建立背景模型,新帧与模型比较,提取前景并进行人员跟踪。文章附有程序代码示例,展示从读取视频到结果显示的流程。最后,结果保存在Result.mat文件中。
|
21小时前
|
资源调度 算法 块存储
m基于遗传优化的LDPC码OMS译码算法最优偏移参数计算和误码率matlab仿真
MATLAB2022a仿真实现了遗传优化的LDPC码OSD译码算法,通过自动搜索最佳偏移参数ΔΔ以提升纠错性能。该算法结合了低密度奇偶校验码和有序统计译码理论,利用遗传算法进行全局优化,避免手动调整,提高译码效率。核心程序包括编码、调制、AWGN信道模拟及软输入软输出译码等步骤,通过仿真曲线展示了不同SNR下的误码率性能。
9 1
|
21小时前
|
存储 算法 数据可视化
基于harris角点和RANSAC算法的图像拼接matlab仿真
本文介绍了使用MATLAB2022a进行图像拼接的流程,涉及Harris角点检测和RANSAC算法。Harris角点检测寻找图像中局部曲率变化显著的点,RANSAC则用于排除噪声和异常点,找到最佳匹配。核心程序包括自定义的Harris角点计算函数,RANSAC参数设置,以及匹配点的可视化和仿射变换矩阵计算,最终生成全景图像。

热门文章

最新文章