java sequence 生成器_分布式高效唯一ID生成器(sequence)

本文介绍了Twitter的Snowflake算法,一种用于生成64位唯一ID的序列算法,适用于高并发场景。Snowflake将时间戳、工作机器ID和序列号结合,保证了ID的全局唯一性和时间顺序。时间戳占用41位,支持到2082年;工作机器ID占用10位,最多支持1023台机器;序列号占用12位,每毫秒可生成4095个ID。在分布式系统中,Snowflake算法能有效地在不同节点上生成不重复的ID。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分布式高效唯一ID生成器(sequence)

简介

高效GUID产生算法(sequence),基于Snowflake实现64位自增ID算法。

Twitter-Snowflake算法产生的背景相当简单,为了满足Twitter每秒上万条消息的请求,每条消息都必须分配一条唯一的id,这些id还需要一些大致的顺序(方便客户端排序),并且在分布式系统中不同机器产生的id必须不同。

性能测试数据:

perf.png

Snowflake算法核心

把时间戳,工作机器id,序列号组合在一起。

snowflake-64bit.jpg

除了最高位bit标记为不可用以外,其余三组bit占位均可浮动,看具体的业务需求而定。默认情况下41bit的时间戳可以支持该算法使用到2082年,10bit的工作机器id可以支持1023台机器,序列号支持1毫秒产生4095个自增序列id。下文会具体分析。

Snowflake – 时间戳

这里时间戳的细度是毫秒级,具体代码如下,建议使用64位linux系统机器,因为有vdso,gettimeofday()在用户态就可以完成操作,减少了进入内核态的损耗。

Snowflake – 工作机器id

严格意义上来说这个bit段的使用可以是进程级,机器级的话你可以使用MAC地址来唯一标示工作机器,工作进程级可以使用IP+Path来区分工作进程。如果工作机器比较少,可以使用配置文件来设置这个id是一个不错的选择,如果机器过多配置文件的维护是一个灾难性的事情。

Snowflake – 序列号

序列号就是一系列的自增id(多线程建议使用atomic),为了处理在同一毫秒内需要给多条消息分配id,若同一毫秒把序列号用完了,则“等待至下一毫秒”。

获取

cn.izern

sequence

${version}

使用

import cn.izern.sequence.Sequence;

Sequence sequence = new Sequence();

sequence.nextId();

线程安全,生成唯一序列ID

hibernate/jpa 使用Sequence作为ID生成方式

private Long id;

// other

@Id

@GeneratedValue(generator = "idGenerator")

@GenericGenerator(name = "idGenerator", strategy = "cn.izern.hibernate.id.IDSequenceGenerator")

public Long getId() {

return id;

}

public void setId(Long id) {

this.id = id;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值