• 分布式全局唯一 ID生成器(百度UidGenerator)


    为什么要使用全局ID生成器?

    分库分表中必定会面临着一个问题, 就是如何快速高效的生成唯一性ID。

    使用UUID作为主键?

    • 生成的ID是字符串,不是数字,难以比较大小

    • 生成的不是有序增长的, 在很多的查询中不方便

    使用数据库主键自增

    • 分库分表的场景下无法保证主键唯一性

    UidGenerator简介

    UidGenerator是百度开源的Java语言实现,基于Snowflake算法的唯一ID生成器。
    它是分布式的,并克服了雪花算法的并发限制。
    单个实例的QPS能超过6000000。
    需要的环境:JDK8+,MySQL(用于分配WorkerId)

    雪花算法snowflake

    由下图可知,雪花算法的几个核心组成部分:
    1为sign标识位;
    41位时间戳;
    10位workId(数据中心 +工作机器,可以其他组成方式);
    12位自增序列;

    在这里插入图片描述

    但是百度对这些组成部分稍微调整了一下:

    在这里插入图片描述

    由上图可知,UidGenerator的时间部分只有28位,这就意味着UidGenerator默认只能承受8.5年(2^28-1/86400/365)
    也可以根据你业务的需求,UidGenerator可以适当调整delta seconds、worker node id和sequence占用位数。

    SpringBoot整合百度UidGenerator

    在项目使用的数据库里,执行WORKER_NODE表脚本

    DROP TABLE IF EXISTS WORKER_NODE;
    CREATE TABLE WORKER_NODE
    (
    ID BIGINT NOT NULL AUTO_INCREMENT COMMENT 'auto increment id',
    HOST_NAME VARCHAR(64) NOT NULL COMMENT 'host name',
    PORT VARCHAR(64) NOT NULL COMMENT 'port',
    TYPE INT NOT NULL COMMENT 'node type: CONTAINER(1), ACTUAL(2), FAKE(3)',
    LAUNCH_DATE DATE NOT NULL COMMENT 'launch date',
    MODIFIED TIMESTAMP NOT NULL COMMENT 'modified time',
    CREATED TIMESTAMP NOT NULL COMMENT 'created time',
    PRIMARY KEY(ID)
    )
     COMMENT='DB WorkerID Assigner for UID Generator',ENGINE = INNODB;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    maven的pom文件里引入依赖

    <properties>
            <uid-generator.version>1.0.3.RELEASEuid-generator.version>
    properties>
    <dependencies>
    	<dependency>
            	<groupId>com.github.wujun234groupId>
            	<artifactId>uid-generator-spring-boot-starterartifactId>
            	<version>${uid-generator.version}version>
    	dependency>
    dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    配置文件application.yml里引入自定义配置

    # UidGenerator
    # 初始时间, 默认:"2019-02-20"
    uid:
      epochStr: 2020-05-08
      # 时间位, 默认:30
      timeBits: 41
      # 机器位, 默认:16
      workerBits: 10
      # 序列号, 默认:7
      seqBits: 12
      # 是否容忍时钟回拨, 默认:true
      enableBackward: true
      # RingBuffer size扩容参数, 可提高UID生成的吞吐量, 默认:3
      CachedUidGenerator:
        boostPower: 3
      # 指定何时向RingBuffer中填充UID, 取值为百分比(0, 100), 默认为50
        paddingFactor: 50
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    IdGenerator.java工具类

    这边我们使用CachedUidGenerato

    @Component
    public class IdGenerator {
        @Autowired
        private CachedUidGenerator cachedUidGenerator;
    
        /**
         * 获取uid
         *
         * @return
         */
        public long nextId() {
            return cachedUidGenerator.getUID();
        }
    
        /**
         * 格式化传入的uid,方便查看其实际含义
         *
         * @param uid
         * @return
         */
        public String parse(long uid) {
            return cachedUidGenerator.parseUID(uid);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
  • 相关阅读:
    【Java基础 | IO流】File类概述和常用方法使用
    达之云BI平台助力融通集团陕西军民服务社有限公司实现数字化运营
    GitHub-使用 Git工具 创建密钥id_rsa.pub
    shell编程增强
    TF-PLA 转铁蛋白修饰聚乳酸 Transferrin-PEG-PLA
    电子元器件商城与数据手册下载网站汇总
    python模块下载
    CMS建站流程
    G1D8-GNN@lab0&APT论文&美亚2021个人赛
    11.20二叉树基础题型
  • 原文地址:https://blog.csdn.net/qq_29917503/article/details/128039707