什么是雪花ID

snowflake是Twitter开源的分布式ID生成算法,结果是64bit的Long类型的ID,有着全局唯一和有序递增的特点。

  • 最高位是符号位,因为生成的 ID 总是正数,始终为0,不可用。
  • 41位的时间序列,精确到毫秒级,41位的长度可以使用69年。时间位还有一个很重要的作用是可以根据时间进行排序。
  • 10位的机器标识,10位的长度最多支持部署1024个节点。
  • 12位的计数序列号,序列号即一系列的自增ID,可以支持同一节点同一毫秒生成多个ID序号,12位的计数序列号支持每个节点每毫秒产生4096个ID序号。
  • 优点

  • 唯一性:雪花算法生成的ID是全局唯一的,可以在分布式系统中生成不重复的ID。ID由机器ID、时间戳和序列号组成,结合了这些因素以确保唯一性。

  • 可排序性:雪花算法生成的ID包含时间戳,因此ID之间的时间顺序是有意义的。这对于按时间排序的数据非常有用,可以方便地根据ID获取生成的顺序信息。

  • 高性能:雪花算法生成ID的过程是基于位运算和位移操作的,计算速度很快,并且生成ID的成本很低。

  • 独立性:每个节点(进程或机器)的雪花算法生成ID的过程是相互独立的,不需要依赖于中央系统或数据库。这意味着系统可以水平扩展,并且不会成为单点故障。

  • 缺点

  • 依赖系统时钟:雪花算法使用时间戳来保证ID的唯一性和可排序性。如果系统时钟发生回退或者不同节点的时钟不同步,可能会导致生成的ID重复或者乱序。

  • 有限的容量:雪花算法中的每个部分(机器ID、时间戳和序列号)所占的位数是固定的,这意味着在特定的时间段内和特定机器上,ID的生成数量是有限的。如果超过了容量限制,就需要等待下一个时间戳的到来。

  • 无法保证全局唯一性:虽然雪花算法可以在分布式系统中生成相对唯一的ID,但并不能保证全局的唯一性。如果存在多个独立的分布式系统使用相同的机器ID,并且互相不同步时间戳,那么有可能生成重复的ID。

缺点也是有的,就是强依赖机器时钟,如果机器上时钟回拨,有可能会导致主键重复的问题。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Boot中使用雪花ID算法可以确保生成分布式系统中唯一的ID雪花ID***ID、机器ID和自增序列号。下面是使用雪花ID生成器的步骤: 1. 添加雪花ID生成器的依赖:在`pom.xml`文件中添加以下依赖: ```xml <dependency> <groupId>com.github.snowflake</groupId> <artifactId>snowflake</artifactId> <version>3.0.0</version> </dependency> ``` 2. 创建一个雪花ID生成器的配置类:在Spring Boot项目中创建一个配置类,例如`SnowflakeConfig.java`,并添加以下代码: ```java import com.github.snowflake.SnowFlakeIdGenerator; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class SnowflakeConfig { private static final long DATA_CENTER_ID = 1L; // 数据中心ID private static final long MACHINE_ID = 1L; // 机器ID @Bean public SnowFlakeIdGenerator snowFlakeIdGenerator() { return new SnowFlakeIdGenerator(DATA_CENTER_ID, MACHINE_ID); } } ``` 3. 使用雪花ID生成器生成唯一ID:在需要生成唯一ID的地方,注入`SnowFlakeIdGenerator`并调用`nextId()`方法即可生成唯一ID,例如: ```java import com.github.snowflake.SnowFlakeIdGenerator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class MyService { @Autowired private SnowFlakeIdGenerator snowFlakeIdGenerator; public long generateUniqueId() { return snowFlakeIdGenerator.nextId(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值