mysql 唯一id生成器,扩展篇之唯一ID生成总结

本文详细介绍了几种常见的唯一ID生成方案,包括UUID、数据库自增、Leaf-segment和Leaf-snowflake算法。每种方案都有其优缺点,如UUID易存储但安全性不高,数据库自增简单但依赖性强,Leaf-segment降低数据库压力但仍有优化空间,Leaf-snowflake通过Zookeeper分配workerID以提高可用性。文章还讨论了时钟回拨问题及其解决方案。
摘要由CSDN通过智能技术生成

生成ID的基本要求

1.必须全局唯一,包括在分布式的环境下

2.一般都需要单调递增,因为一般都会存到数据库,而Innodb的特性就是将内容存储在主键索引树上的叶子节点,而且是从左往右,递增的,所以考虑到数据库性能,一般生成的id也最好是单调递增.

3.可能还会需要无规则,因为如果使用唯一ID作为订单号这种,为了不然别人知道一天的订单量是多少,就需要这个规则.

常见唯一Id生成方案

UUID

数据库生成

Leaf-segment数据库方案

Leaf-snowflake方案

UUID

UUID(Universally Unique Identifier)的标准型式包含32个16进制数字,以连字号分为五段,形式为8-4-4-4-12的36个字符.

目前共有5种方式生成UUID,详情见IETF发布的UUID规范 A Universally Unique IDentifier (UUID) URN Namespace。

优点:

本地生成,没有网络消耗,性能很高

缺点:

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

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

③ID作为主键时在特定的环境会存在一些问题,比如做DB主键的场景下,UUID就非常不适用:对MySQL索引不利:如果作为数据库主键,在InnoDB引擎下,UUID的无序性可能会引起数据位置频繁变动,严重影响性能。

雪花算法snowflake

把64-bit分别划分成多段,分开来标示机器、时间

5cd38e3ea541?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

雪花算法.png

41-bit的时间可以表示(1L<<41)/(1000L360024*365)=69年的时间,10-bit机器可以分别表示1024台机器。如果我们对IDC划分有需求,还可以将10-bit分5-bit给IDC,分5-bit给工作机器。这样就可以表示32个IDC,每个IDC下可以有32台机器,可以根据自身需求定义。12个自增序列号可以表示2^12个ID,理论上snowflake方案的QPS约为409.6w/s,这种分配方式可以保证在任何一个IDC的任何一台机器在任意毫秒内生成的ID都是不同的。

优点:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值