雪花算法优化版ID生成器原理及应用解析?

2026-05-25 23:102阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计999个文字,预计阅读时间需要4分钟。

雪花算法优化版ID生成器原理及应用解析?

目录+ 基于雪花算法的增强版ID生成器 - 快速开始 - 配置解析 - 前瞻性提供 - 两种配置类型 - 详细说明 - 生产推荐 - 使用方式+ JMH 性能测试 - 测试硬件环境 - Sequence 配置 - JMH 参数 - 测试结果+ Tip - 雪花算法增强细节

目录
  • 基于雪花算法的增强版ID生成器
    • 快速开始
  • 配置解析
    • 目前提供两个配置类
    • 详情
  • 生产推荐使用方式
    • JMH 性能测试
      • 测试机硬件情况
      • Sequence 配置参数
      • JMH参数
      • 测试结果
    • Tip

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

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

      快速开始

      1.依赖引入

      <dependency> <groupId>io.github.mocreates</groupId> <artifactId>uid-generator</artifactId> <version>2.0-RELEASE</version> </dependency>

      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,可以结合数据库来使用,后者是利用网卡信息进行自适应

      详情

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

      生产推荐使用方式

      1.依赖引入

      <dependency> <groupId>io.github.mocreates</groupId> <artifactId>uid-generator</artifactId> <version>2.0-RELEASE</version> </dependency>

      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)

      雪花算法优化版ID生成器原理及应用解析?

      测试结果

      BenchmarkModeCntScoreErrorUnitsSingleNodeSequenceTest.nextIdTestthrpt1027825573.565 ± 962298.054ops/s

      Tip

      如果对qps性能要求较高,可以适当调整sequenceBits

      仓库地址

      github.com/mocreates/sequence

      到此这篇关于基于雪花算法实现增强版ID生成器详解的文章就介绍到这了,更多相关雪花算法实现ID生成器内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!

      本文共计999个文字,预计阅读时间需要4分钟。

      雪花算法优化版ID生成器原理及应用解析?

      目录+ 基于雪花算法的增强版ID生成器 - 快速开始 - 配置解析 - 前瞻性提供 - 两种配置类型 - 详细说明 - 生产推荐 - 使用方式+ JMH 性能测试 - 测试硬件环境 - Sequence 配置 - JMH 参数 - 测试结果+ Tip - 雪花算法增强细节

      目录
      • 基于雪花算法的增强版ID生成器
        • 快速开始
      • 配置解析
        • 目前提供两个配置类
        • 详情
      • 生产推荐使用方式
        • JMH 性能测试
          • 测试机硬件情况
          • Sequence 配置参数
          • JMH参数
          • 测试结果
        • Tip

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

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

          快速开始

          1.依赖引入

          <dependency> <groupId>io.github.mocreates</groupId> <artifactId>uid-generator</artifactId> <version>2.0-RELEASE</version> </dependency>

          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,可以结合数据库来使用,后者是利用网卡信息进行自适应

          详情

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

          生产推荐使用方式

          1.依赖引入

          <dependency> <groupId>io.github.mocreates</groupId> <artifactId>uid-generator</artifactId> <version>2.0-RELEASE</version> </dependency>

          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)

          雪花算法优化版ID生成器原理及应用解析?

          测试结果

          BenchmarkModeCntScoreErrorUnitsSingleNodeSequenceTest.nextIdTestthrpt1027825573.565 ± 962298.054ops/s

          Tip

          如果对qps性能要求较高,可以适当调整sequenceBits

          仓库地址

          github.com/mocreates/sequence

          到此这篇关于基于雪花算法实现增强版ID生成器详解的文章就介绍到这了,更多相关雪花算法实现ID生成器内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!