业务要求:

唯一性,时间相关,粗略有序,可反解,可制造

 

1: 建一个表,插入一条记录,获取其id(趋势有序, 非高并发,生成的ID中没有带Timestamp);

2:待含义前缀+时间+6位自然增长(带Timestamp,非趋势有序),利用分布式缓存的cas

3:java自带UUID

优势:

本地生成ID,不需要进行远程调用。

全局唯一不重复。

水平扩展能力非常好。

劣势:

ID有128 bits,占用的空间较大,需要存成字符串类型,索引效率极低。

生成的ID中没有带Timestamp,无法保证趋势递增

 

UUID由以下几部分的组合:

(1)当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同。

(2)时钟序列

(3)全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。

 

UUID类型 version

基于时间的 UUID 1

DCE 安全 UUID 2

基于名称的 UUID 3

随机生成的 UUID 4

 

4: Twitter Snowflake

snowflake是twitter开源的分布式ID生成算法,其核心思想是:产生一个long型的ID,使用其中41bit作为毫秒数,10bit作为机器编号,12bit作为毫秒内序列号。这个算法单机每秒内理论上最多可以生成1000*(2^12)个,也就是大约400W的ID,完全能满足业务的需求。

问题:

需要引入zookeeper(强一致性)和独立的snowflake专用服务器

为了保持增长的趋势,要避免有些服务器的时间早,有些服务器的时间晚,需要控制好所有服务器的时间,而且要避免NTP时间服务器回拨服务器的时间。

在跨毫秒时,序列号总是归0,会使得序列号为0的ID比较多,导致生成的ID取模后不均匀,所以序列号不是每次都归0,而是归一个0到9的随机数。

 

4:批量生成,每一个client拿到一批,使用完后再调用(性能考虑,准连续)