• 分布式序号生成组件


    序号生成器

    特性

    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());
        }
    
      }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    初始化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';
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    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');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100

    maven

    
    
        io.github.albinchang
        sequence
        2023.08.29
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    兼容性

    jdk8.0
    spring-boot
    mysql

  • 相关阅读:
    SpringBoot--参数校验--@Valid--使用/实例
    干货 | 外贸业务员必备的实用网站
    如何处理单据保存/审核时提示:“更新即时库存时,基本单位数量与辅单位数量为一正一负,即时库存更新不成功
    Codeforces Round 900 (Div. 3) F
    qt json
    Dubbo高手之路4,Dubbo服务提供者详解
    计算机组成原理学习笔记:主机三件套硬件部件
    RocketMQ(五)RocketMQ集群架构
    linux网络协议栈源码分析 - 路由查找树
    PTE阶段规划
  • 原文地址:https://blog.csdn.net/shumeizwb/article/details/132648743