分布式环境生成一个唯一id从来不是一个容易的事,不同的节点都独立的各自生成id,高并发性场景下容易生成相同的订单id。
方案1:数据库自增主键
优点:全局唯一、不会重复
缺点:订单id有序、容易被外界爬虫知道业务的订单量数据
方案2:UUID
UUID(Universally Unique Identifier)的标准型式包含32个16进制数字,以连字号分为五段,形式为8-4-4-4-12的36个字符,示例:550e8400-e29b-41d4-a716-446655440000
优点:性能非常高,本地生成,没有网络消耗
缺点:不易于存储,UUID太长,16字节128位,通常以36长度的字符串表示
由于是无序,长字符串,存储数据库后索引效率比较差
String uuid = UUID.randomUUID().toString()
方案3:时间戳 + ip或者Mac地址
优点:无序、高并发情况下几乎不可能产生相同id,大部分业务可以满足使用
缺点:不适用超高并发,例如1ms可以生成多个订单id的场景,对系统健壮性要求极高的场景
方案4:snowflake(推荐)
Snowflake