分布式序号生成组件

序号生成器

特性

  1. 全局唯一
  2. 分布式
  3. 趋势递增
  4. 高并发
  5. 纯数字
  6. 可读性

设计

号段 格式 说明 满足要求
日期

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

github

https://github.com/AlbinChang/simple/tree/master/sequence

demo

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());
    }

  }
}

初始化sql

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');

maven



    io.github.albinchang
    sequence
    2023.08.29

兼容性

jdk8.0
spring-boot
mysql

你可能感兴趣的:(分布式,java,spring,boot,开源)