CREATE TABLE `sequence_step` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`barrier` bigint(20) NOT NULL DEFAULT '1' COMMENT '当前序列值最大值',
`step` int(11) NOT NULL DEFAULT '100' COMMENT '每次递增量',
`sn` varchar(128) NOT NULL DEFAULT '' COMMENT '业务字段',
`version` bigint(20) NOT NULL DEFAULT '1' COMMENT '乐观锁版本',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_sn` (`sn`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='全局ID生成表';
- barrier:目前应用程序已经获取的最大ID值(即 ID 池的最大值);
- step:每次获取时,递增的步长;
- sn:业务字段名称,全局唯一。
可以通过表来配置每个业务字段的 ID 生成策略,比如 user_id,初始值是 1,步长是 100。
第一次的 ID 区间为【1,101),初始值更新为 101,则 ID 池子的数字就是【1,101)
系统优先去 ID 池子去取数据,当 ID 池子消耗完了后,再请求数据库,拿到新的初始值,并生成数据。
第二次的 ID 区间为【101,201),初始值更新为 201
…
可以看到,如果区间设置的太小,访问数据库就很频繁;区间设置的太大,万一系统崩溃了,断续的间隔就比较大了。