分布式ID生成器
Plan A:号段模式
- 建表
CREATE TABLE `leaf_segment` (
`biz_tag` varchar(128) NOT NULL COMMENT '业务类型',
`max_id` bigint(20) NOT NULL DEFAULT '0' COMMENT 'biz_tag目前所被分配的ID号段最大值',
`step` int(11) NOT NULL DEFAULT '1000' COMMENT '每次分配号段的步长',
`version` int(11) NOT NULL DEFAULT '1' COMMENT '版本号',
`desc` varchar(256) DEFAULT NULL COMMENT '描述',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`biz_tag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='分布式订单分发器';
- 初始化
insert ignore into leaf_segment (`biz_tag`,`desc`) VALUES ('test','just for test');
- 查询并缓存ID号段,利用版本号更新号段
select max_id,step,version from leaf_segment where `biz_tag` = 'test';
- 更新号段
update leaf_segment set `max_id` = `max_id` + `step`,`version` = `version`+1 where version = 1;
Plan B:snowflake
0-00000000 00000000 00000000 00000000 00000000 0-00000000 00-00000000 0000
1+41+10+12(不动位+时间戳+机器标识+计数顺序号)时钟回拨问题