文章目录加载中

分布式ID-数据库唯一ID

# 单机自增

优点:实现简单。

缺点:单机是性能瓶颈。

# 集群自增

设置不同的「自增步长」和「自增步长」。

# 代码demo
set @@auto_increment_offset = 1;     -- 起始值
set @@auto_increment_increment = 2;  -- 步长

缺点:新增机器容易出现重复问题,需要人工介入。

# 号段模式(主流)

思想是从数据库批量获取自增 ID。

重点是数据表设计:

CREATE TABLE id_generator (
  id int(10) NOT NULL,
  biz_type int(20) NOT NULL COMMENT '业务标识',
  max_id bigint(20) NOT NULL COMMENT '业务标识对应的当前最大id',
  step int(20) NOT NULL COMMENT '业务标识对应的号段步长',
  version int(20) NOT NULL COMMENT '版本号', // 乐观锁,每次都更新version,保证并发时数据的正确性
  PRIMARY KEY (`id`)
)

流程是:

  • 从数据库取出号段范围,例如 1000-2000
    使用乐观锁,防止并发问题:

    update id_generator
    set
    max_id = #{max_id+step},
    version = version + 1
    where
    version = # {version} // 防止并发问题
    and biz_type = XXX
    
    
  • 本地化存储取出的号段,例如放入内存

  • 使用取出的号段

  • 用完后,回到第一步,继续取出 2k-3k

  • 如此循环

本文来自心谭博客:xin-tan.com,经常更新web和算法的文章笔记,前往github查看目录归纳:github.com/dongyuanxin/blog