SkillAgentSearch skills...

Sequence

Id generator based on snowflake algorithm with stronger capability.

Install / Use

/learn @mocreates/Sequence
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

sequence

基于雪花算法的增强版ID生成器

  • 解决了时间回拨的问题
  • 无需手动指定workId, 微服务环境自适应
  • 可配置化

快速开始

  1. 依赖引入
    <dependency>
        <groupId>io.github.mocreates</groupId>
        <artifactId>uid-generator</artifactId>
        <version>${uid-generator.version}</version>
    </dependency>
    
    ${uid-generator.version}说明
  2. 配置序列器 Sequence
     @Bean
     public Sequence sequence() {
         SequenceConfig sequenceConfig = new SimpleSequenceConfig();
         return new Sequence(sequenceConfig);
     }
    
  3. 使用序列器生成ID
     @Autowired
     private Sequence sequence;
     
     public long generateId() {
         return sequence.nextId();
     }
    

配置解析

目前提供两个配置类

  • io.github.mocreates.config.DefaultSequenceConfig
  • io.github.mocreates.config.SimpleSequenceConfig

前者需要手动指定 workerId、datacenterId,可以结合数据库来使用,后者是利用网卡信息进行自适应。 推荐使用默认配置类,网卡mac地址可人为伪造,加之虚拟化的发展,其唯一性已经无法保证,有概率重复。

详情

| 字段名 | 释义 | 默认值 | | ---------------- | ------------------------------------------------------ | -------------- | | twepoch | 可以被设置为最接近项目启用前的某个时间点(unix 时间戳) | 1665817757000L | | workerIdBits | 机器位所占的bit位数 | 19L | | datacenterIdBits | 数据标识位所占的bit位数 | 0L | | sequenceBits | 毫秒内自增位数 | 3L | | workerId | 机器位 | | | datacenterId | 数据位 | 0L | | inetAddress | 网络相关信息 | |

生产推荐使用方式

  1. 依赖引入
    <dependency>
        <groupId>io.github.mocreates</groupId>
        <artifactId>uid-generator</artifactId>
        <version>${uid-generator.version}</version>
    </dependency>
    
    ${uid-generator.version}说明
  2. 创建表
    CREATE TABLE `worker_node` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `node_info` varchar(512) NOT NULL,
      `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
      `gmt_modify` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='DB WorkerID Assigner for UID Generator';
    
  3. 配置 (利用主键自增来分配workerId, 解决分布式环境下手动指定workerId的痛点)
     @Bean
     public Sequence sequence(WorkerNodeMapper workerNodeMapper) throws UnknownHostException {
         WorkerNode workerNode = new WorkerNode();
         InetAddress localHost = InetAddress.getLocalHost();
         workerNode.setNodeInfo(localHost.toString());
         workerNodeMapper.insertSelective(workerNode);
         DefaultSequenceConfig defaultSequenceConfig = new DefaultSequenceConfig();
         defaultSequenceConfig.setWorkerId(workerNode.getId());
         return new Sequence(defaultSequenceConfig);
     }
    
  4. 使用序列器生成ID
     @Autowired
     private Sequence sequence;
     
     public long generateId() {
         return sequence.nextId();
     }
    

JMH 性能测试

测试机硬件情况

MacBook Pro (13-inch, M1, 2020) 8C 16G

Sequence 配置参数

 private static final DefaultSequenceConfig SEQUENCE_CONFIG = new DefaultSequenceConfig();

 static {
     SEQUENCE_CONFIG.setSequenceBits(22);
     SEQUENCE_CONFIG.setWorkerIdBits(0);
     SEQUENCE_CONFIG.setDatacenterIdBits(0);
     SEQUENCE_CONFIG.setTwepoch(System.currentTimeMillis());

     SEQUENCE_CONFIG.setWorkerId(0L);
     SEQUENCE_CONFIG.setDatacenterId(0L);
 }
 private static final Sequence SEQUENCE = new Sequence(SEQUENCE_CONFIG);

JMH参数

@BenchmarkMode(Mode.Throughput)
@Threads(10)
@Warmup(iterations = 3, time = 10, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 10, time = 10, timeUnit = TimeUnit.SECONDS)
@State(value = Scope.Benchmark)
@Fork(1)
@OutputTimeUnit(TimeUnit.SECONDS)

测试结果

| Benchmark | Mode | Cnt | Score | Error | Units | | --------------------------------- | ----- | ---- | ------------------------- | ----- | ----- | | SingleNodeSequenceTest.nextIdTest | thrpt | 10 | 27825573.565 ± 962298.054 | | ops/s |

版本说明

|uid-generator.version| jdk支持| | ---- | ---- | |3.0.1-RELEASE| >=21| |2.0-RELEASE | >=8|

View on GitHub
GitHub Stars10
CategoryDevelopment
Updated3mo ago
Forks0

Languages

Java

Security Score

87/100

Audited on Dec 23, 2025

No findings