号段 | 格式 | 说明 | 满足要求 |
---|---|---|---|
日期 | yyyyMMdd 4位数字 |
表示序号生成的日期,用jvm系统日期 | 可读性 |
毫秒 | 8位数字,右补0 | 一天毫秒的空间: 24*3600*1000 = 86400000 |
趋势递增 |
序号 | 4位数字,右补0 | 每毫秒10000并发请求 |
高并发 |
机器序号 | 4位数字,右补0 | 最多支持10000个jvm实例,在jvm启动时注册一个机器序号,10秒自动续期一次,超过60秒未续期,回收机器序号 | 分布式、全局唯一 |
总计20位数字,日期、毫秒、序号,都是jvm本地获取,保证了序号生成的效率,机器序号在启动时注册并自动续期保证不同jvm之间不会注册到重复机器序号。
号段 | 实现方式 |
---|---|
日期 | jdk |
毫秒 | jdk: 系统毫秒数 % 100000000 |
序号 | jdk: 原子整型类,循环递增 0-9999 |
机器序号 | jvm个数少于100,建议数据库 jvm个数大于100,建议redis |
seq_registry 机器序号注册表
字段英文名 | 字段中文名 | 字段类型 | 是否主键 |
---|---|---|---|
seq_no | 机器序号 | int | 是 |
jvm_instance | jvm实例 ip:pid |
varchar(100) | |
renewal_time | 续期时间 | datetime | |
version | 版本号 | bigint |
机器序号注册表需要初始化10000条序号:0-9999
https://github.com/AlbinChang/simple/tree/master/sequence
https://github.com/AlbinChang/simple/tree/master/sequence-demo
package spring.simple.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import spring.simple.sequence.service.SeqService;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(DemoApplication.class, args);
SeqService seqService = applicationContext.getBean(SeqService.class);
for (int i = 0; i < 1000000; i++) {
System.out.println(seqService.getNextNumber());
}
}
}
ddl
CREATE TABLE `seq_registry` (
`seq_no` int(11) NOT NULL COMMENT '机器序号',
`jvm_instance` varchar(100) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'JVM 示例 ip:pid',
`renewal_time` datetime DEFAULT NULL COMMENT '续期时间',
`version` bigint(10) NOT NULL DEFAULT '0' COMMENT '版本号',
PRIMARY KEY (`seq_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='机器序号注册表\n机器序号注册表需要初始化10000条序号:0-9999';
dml
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('1', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('2', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('3', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('4', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('5', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('6', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('7', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('8', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('9', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('10', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('11', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('12', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('13', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('14', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('15', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('16', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('17', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('18', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('19', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('20', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('21', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('22', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('23', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('24', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('25', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('26', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('27', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('28', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('29', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('30', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('31', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('32', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('33', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('34', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('35', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('36', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('37', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('38', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('39', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('40', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('41', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('42', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('43', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('44', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('45', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('46', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('47', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('48', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('49', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('50', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('51', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('52', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('53', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('54', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('55', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('56', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('57', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('58', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('59', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('60', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('61', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('62', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('63', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('64', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('65', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('66', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('67', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('68', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('69', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('70', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('71', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('72', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('73', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('74', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('75', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('76', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('77', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('78', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('79', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('80', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('81', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('82', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('83', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('84', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('85', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('86', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('87', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('88', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('89', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('90', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('91', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('92', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('93', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('94', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('95', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('96', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('97', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('98', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('99', '0');
INSERT INTO `seq_registry` (`seq_no`, `version`) VALUES ('100', '0');
io.github.albinchang
sequence
2023.08.29
jdk8.0
spring-boot
mysql