分布式id-雪花算法

通常我们在生成用户id或者订单id时都需要一个全局唯一的id来唯一标识,在单体情况下我们可以使用UUID、时间戳、数据库自增id

而在分布式情况下,需要考虑大量服务器之间生成的id全局唯一,所以就使用了今天要介绍的雪花算法来生成分布式下的全局id

单体服务UUID、时间戳、数据库自增id存在以下问题:

  1. UUID是无序的且数据非常大(128bit),且一般会使用36位长度的字符串存储,这样会导致id存入数据库时需要大量的存储空间来存放id,且id一般为主键,则在生成聚簇索引时则会耗费巨大的空间,并且UUID一般不呈递增趋势,在生成数据库索引时会出现大量页分裂等情况,影响性能;

  2. 时间戳则不满足高并发情况下的id,对于在某一毫秒只能生成的一个id,无法应对高并发场景下的id生成

  3. 自增id不适合分布式数据库分库分表,对于多个数据库,id无法满足所有数据库生成的id全局唯一,并且每次从数据库中获取id性能非常低


所以我们引入了一个分布式id生成算法:雪花算法,接下来就详细介绍一下雪花算法

雪花算法主要是由三部分组成:

      1. 1bit的符号位+41bit的时间戳格式

1bit符号位即0表示正数,1表示负数,由于一般都是使用正数,所以一般都是直接固定为0

为什么时间戳格式是41位呢?

雪花算法是直接使用currentTimeMillis()方法生成的时间戳

System.currentTimeMillis();

该方法生成的时间戳是一个13位的十进制格式,但是转换为二进制是41位

long l = System.currentTimeMillis();
System.out.println(l);  //1716194029842
System.out.println(Long.toBinaryString(System.currentTimeMillis()) );  //11000111110010101001000101011000100010011

      2. 5bit的数据中心+5bt的机器标识

数据中心:表示当前服务器所在集群地,例如设置北京为0,上海为1,深圳为2...,数据中心最多只支持2^5 - 1个

机器标识:表示服务器的一个唯一标识,对于某地来说最多只能支持2^5 - 1个机器

      3. 12bit的序列号

序列号主要是为了满足在高并发场景下,需要生成大量id且满足不重复的需求,所以雪花算法在原本基础上加上了序列,即在数据中心、机器标识确定时,每一毫秒最多可生成2^12 - 1个不重复的id

由于雪花算法是使用的Long数据类型,使用的位数加起来1+41+5+5+12 = 64位的Long数据类型,将Long类型的位数最大化了

各位数是怎么进行拼凑的呢?

我们使用全1表示的时间戳,则符号位加时间戳为

011111111111111111111111111111111111111111

我们将时间戳左移22位即可得到(右边用0补齐)

0111111111111111111111111111111111111111110000000000000000000000

使用全1的数据中心及机器标识,并将数据中心和机器标识分别向左移动17位和12位,即得到:

0000000000000000000000000000000000000000001111100000000000000000

0000000000000000000000000000000000000000000000011111000000000000

最后12位为序列号,不需要做移位操作,直接拼接即可

最后将所有的数字做与运算,即可拼接为完整的64位Long类型的id号

1111111111111111111111111111111111111111111111111111000000000000

总结:

  1. 雪花算法生成的全局id可满足高并发情况下的id唯一性要求
  2. 雪花算法采用的时间戳+序列号,满足全局id的递增趋势,提高数据库索引xing'n
  3. 雪花算法生成的id采用Long数据类型,保存时相对于字符串占用更少的存储空间
  • 18
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值