返回顶部
首页 > 资讯 > 后端开发 > Python >基于雪花算法实现增强版ID生成器详解
  • 831
分享到

基于雪花算法实现增强版ID生成器详解

雪花算法实现ID生成器雪花算法 ID生成 2022-11-13 18:11:17 831人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录基于雪花算法的增强版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 时间戳)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>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)

测试结果

BenchmarkModeCntScoreErrorUnits
SingleNodeSequenceTest.nextIdTestthrpt1027825573.565 ± 962298.054 ops/s

Tip

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

仓库地址

https://github.com/mocreates/sequence

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

--结束END--

本文标题: 基于雪花算法实现增强版ID生成器详解

本文链接: https://lsjlt.com/news/169527.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作