文章目录加载中
分布式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