• 分布式全局唯一 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
  • 相关阅读:
    redisson springboot配置
    加速企业AI实施:成功策略和效率方法
    算法模型总结:单调栈
    三十二、【进阶】hash索引结构
    11链表-迭代与递归
    课堂练习10 python数据库编程
    Java 环境变量配置
    前端开发学习之【Vue】-下
    vue3基础知识
    工艺防错指导、可视化工具管理——SunTorque智能扭矩系统
  • 原文地址:https://blog.csdn.net/qq_29917503/article/details/128039707