分布式全局唯一ID生成方式:

 

1、uuid 

优点:简单、方便、唯一

缺点:分布式Id 一般都是作为主键使用,虽然是唯一Id,但是生成的uuid是无序、非自增,产生的id比较长, 浪费存储空间

且 一般mysql数据库都采用b+tree存储索引,所以每次插入新的uuid 索引都会大幅调整,导致节点产生分裂,会创造出很多不饱和的节点,

降低了插入数据库的性能

 

2、mysql 主键自增( replace into   唯一索引存在时 先删除数据 再新增 , 和 insert 类似 )

优点:产生id唯一、且自增

缺点:高并发产生id时,性能有限,适合中小项目

存在问题:单个数据库,存在宕机危险

解决方法:mysql集群,每个Mysql 自增步长不一样,但是 后面业务增加,需要再新增mysql一个 来做唯一id,不好扩展,

且 每次都要读写数据库  也不能满足 大量的高并发

 

3、redis

优点:redis 是单线程,所以能保证原子性,基于内存,性能高、能满足高并发(集群,每个redis也是设置不同的步长)。

缺点: 如果只是单纯的需要一个全局唯一Id, 要去维护一个redis集群,有点浪费

 

4、Twitter 推特的开源的雪花算法snowflake

mysql 用uuid mysql用uuid做唯一索引 缺点_mysql 用uuid

  1. 1bit,不用,因为二进制中最高位是符号位,1表示负数,0表示正数。生成的id一般都是用整数,所以最高位固定为0
  2. 41bit-时间戳,用来记录时间戳,毫秒级,可以使用 (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69年
  3. 10bit-工作机器id,用来记录工作机器id,包括5位datacenterId和5位workerId。最大1024个节点
  4. 12bit-序列号,序列号,用来记录同毫秒内产生的不同id,最多4096/毫秒

优点:唯一、自增、有序 、无需其他依赖,单纯的算法,效率高,且每毫秒、每个机器能支持生成4096个唯一id

缺点:算法基于时间戳,如果重新设置机器的时间(往回调)就可能产生重复的id

解决方法:美团的leaf、百度的UidGenerator