分布式ID生成方案总结整理( 二 )

3.3、号段模式这种模式也是现在生成分布式ID的一种方法,实现思路是会从数据库获取一个号段范围,比如[1,1000],生成1到1000的自增ID加载到内存中,建表结构如:
CREATE TABLE id_generator (id int(10) NOT NULL,max_id bigint(20) NOT NULL COMMENT '当前最大id',step int(20) NOT NULL COMMENT '号段的布长',biz_type int(20) NOT NULL COMMENT '业务类型',version int(20) NOT NULL COMMENT '版本号',PRIMARY KEY (`id`))

  • biz_type :不同业务类型
  • max_id :当前最大的id
  • step :代表号段的步长
  • version :版本号,就像MVCC一样,可以理解为乐观锁
等ID都用了,再去数据库获取,然后更改最大值
【分布式ID生成方案总结整理】update id_generator set max_id = #{max_id+step}, version = version + 1 where version = # {version} and biz_type = XXX
  • 优点:有比较成熟的方案,像百度Uidgenerator,美团Leaf
  • 缺点:依赖于数据库实现
3.4、 Redis实现Redis分布式ID实现主要是通过提供像INCRINCRBY 这样的自增原子命令,由于Redis单线程的特点,可以保证ID的唯一性和有序性
这种实现方式,如果并发请求量上来后,就需要集群,不过集群后,又要和传统数据库一样,设置分段和步长
优缺点:
  • 优点:Redis性能相对比较好,又可以保证唯一性和有序性
  • 缺点:需要依赖Redis来实现,系统需要引进Redis组件
3.4、 雪花算法(SnowFlake)Snowflake,雪花算法是由Twitter开源的分布式ID生成算法,以划分命名空间的方式将64-bit位分割成多个部分,每个部分代表不同的含义,64位,在java中Long类型是64位的,所以java程序中一般使用Long类型存储
分布式ID生成方案总结整理

文章插图