分布式高效唯一标识生成器(sequence ) )
个人资料
高效的GUID生成算法(sequence )基于Snowflake实现64位自增ID算法。
Twitter-Snowflake算法产生的背景相当简单,为了满足Twitter每秒上万条消息的请求,必须为每条消息分配唯一的id。 此外,这些id需要一些大致的顺序,分布式系统中机器生成的id必须不同。
性能测试数据:
Snowflake算法的核心
组合时间戳、工作装置id和序列号。
除了最高有效位被标记为不可用外,其馀三组位占用率将根据特定业务需要而变化。 缺省情况下,41位时间戳支持使用该算法直到2082年,10位工作机id支持1023台计算机,序列号为1毫秒,支持生成4095个自增长序列id。 以下进行具体分析。
snow flake时间戳
此处的时间戳深度为毫秒级别,具体代码如下,建议使用64位linux系统计算机。 因为有vdso,所以每天的gettimeofday ) )在用户状态下完成操作,减少进入内核状态的损失。
snow flake工作装置id
严格意义上说,此bit段的使用可以是流程级的,在机器级可以使用MAC地址唯一标记工作机器,在工作流程级使用IP Path区分工作流程。 如果工作装置较少,可以使用配置文件设置此id是一个不错的选择。 如果机器太多,配置文件的维护将是灾难性的。
snow flake序列号
序列号是指一系列自扩展id。 多线程建议使用自动。 为了进行处理,必须在同一毫秒内为多个消息分配id,如果在同一毫秒内没有序列号,则会“等待到下一毫秒”。
取得
cn.izern
序列
${version}
使用
import cn.izern.sequence.sequence;
Sequence sequence=new Sequence (;
sequence.nextId (;
线程安全,生成唯一的序列ID
hibernate/jpa使用Sequence作为ID生成方法
私有长id;
//other
@Id
@ generated value (generator=' id generator ' )。
@ generic generator (名称=' id generator ',strategy=' cn.izern.hibernate.id.idsequencegenerator ) )。
公共长门tid
返回id;
}
公共语音设置(longid ) {
this.id=id;
}