spring boot中使用雪花算法生成雪花ID
Posted 随风丶飘
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring boot中使用雪花算法生成雪花ID相关的知识,希望对你有一定的参考价值。
目录
1、什么是雪花算法
雪花算法(Snowflake)是一种生成全局唯一ID的算法,由Twitter公司开发。它可以在分布式系统中生成全局唯一的ID,解决分布式系统中的数据合并和分片等问题。
雪花算法生成的ID是一个64位的长整型数字,由以下部分组成:
-
1个bit:符号位,始终为0。
-
41个bit:时间戳,精确到毫秒级别,可以使用69年。
-
10个bit:工作机器ID,可以部署在1024个节点上。
-
12个bit:序列号,每个节点每毫秒内最多可以生成4096个ID。
雪花算法生成ID的过程非常简单,首先记录一个开始时间,然后每次生成ID时计算当前时间和开始时间之间的时间差,将时间戳和工作机器ID、序列号组合成一个64位的长整型数字,返回给调用方。
雪花算法是一种高效、可靠的全局唯一ID生成算法,已经被广泛应用于分布式系统中。
2、雪花算法的优缺点
优点:
-
全局唯一:雪花算法生成的ID是全局唯一的,可以用于分布式系统中的数据分片和数据合并,避免了ID冲突的问题。
-
时间有序:雪花算法生成的ID中包含了时间戳信息,可以根据ID的大小推算出生成的时间,方便进行数据排序和查询。
-
高性能:雪花算法生成ID的速度很快,可以满足高并发的场景需求。
-
可扩展性:雪花算法的数据结构相对简单,易于扩展和修改。
缺点:
-
依赖于系统时钟:雪花算法生成ID的过程中依赖于系统时钟,如果系统时钟发生回拨,可能会导致生成的ID出现重复。
-
长度固定:雪花算法生成的ID长度固定为64位,可能会导致存储和传输成本较高。
-
不支持分布式计算:雪花算法生成ID的过程是单线程的,不能支持分布式计算。
雪花算法是一种高效、可靠的全局唯一ID生成算法,但需要注意时钟回拨和长度固定等缺点。在选择ID生成算法时,需要综合考虑应用场景和需求,选择适合的算法。
3、spring boot项目中使用雪花算法使用
1、引入雪花算法依赖
<dependency>
<groupId>com.github.beyondfengyu</groupId>
<artifactId>snowflake-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
2、在配置文件中配置雪花算法参数
在 application.yml 或 application.properties 中配置Snowflake算法的参数:
snowflake:
data-center-id: 1 # 数据中心ID,可以使用机器IP地址最后一段数字,范围为0-31
machine-id: 1 # 机器ID,可以使用服务器编号,范围为0-31
3、注入雪花算法对象
在需要生成唯一ID的类中,使用 @Autowired 注解注入 SnowflakeIdWorker 对象:
@Service
public class UserService
@Autowired
private SnowflakeIdWorker snowflakeIdWorker;
public Long generateUserId()
return snowflakeIdWorker.nextId();
使用snowflakeIdWorker.nextId()方法既可以获取生成的雪花ID。
雪花算法源码
参考技术A (1)开源ID:Twitter开源开源的分布式ID生成算法(2)64 bit自增:使用一个64位的long型数字作为一个全局ID,且引入了时间戳概念,基本上保证自增的
(3)64位中,第一位是不用的,其中的41位作为毫秒数,10位(5+5)作为机房机器id,剩下的12位作为序列号
第一个部分,是 1 个 bit: 如果是 1,那么都是负数,但是我们生成的 id 都是正数,所以第一个 bit 统一都是 0。
第二个部分是 41 个 bit: 表示的是时间戳。41 bit 可以标识 2 ^ 41 - 1 个毫秒值,换算成年就是表示 69 年的时间。
第三个部分是 5 个 bit: 表示的是机房 id,10001。
第四个部分是 5 个 bit: 表示的是机器 id,11001。部署在 2^10 台机器上,也就是 1024 台机器。
第五个部分是 12 个 bit: 表示的序号,就是某个机房某台机器上这一毫秒内同时生成的 id 的序号,0000 0000 0000。记录同一个毫秒内产生的不同 id
(1)请求:某个微服务service需要生成一个全局唯一Id,那就可以给部署了snokeFlake算法的系统发送一个请求来生成唯一Id
(2)二进制生成:接着会用"二进制位运算"来生成一个64位的long型id,并且64位第一个bit无意义,算法系统当然知道当前的时间戳,自己的机房和机器
(3)毫秒内累加序号:最后在判断下这是这个毫秒下的第几个请求,给这次生成的Id的请求累加一个序号,作为最后的12个bit
(4)算法保证唯一:在同一毫秒下,同一个机房下的一台机器,生成一个唯一的id(12位=4096个), 如果一毫秒生成的Id数量超过了4095,就知会等待下一个毫秒在生成!但是估计没有请求能有这么频繁!
以上是关于spring boot中使用雪花算法生成雪花ID的主要内容,如果未能解决你的问题,请参考以下文章