文章目录

  • 为什么要使用全局ID生成器?
  • 使用UUID作为主键?
  • 使用数据库主键自增?
  • UidGenerator简介
  • 雪花算法snowflake
  • SpringBoot整合百度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;

maven的pom文件里引入依赖

<properties><uid-generator.version>1.0.3.RELEASE</uid-generator.version>
</properties>
<dependencies><dependency><groupId>com.github.wujun234</groupId><artifactId>uid-generator-spring-boot-starter</artifactId><version>${uid-generator.version}</version></dependency>
</dependencies>

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

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

IdGenerator.java工具类

这边我们使用CachedUidGenerato

@Component
public class IdGenerator {@Autowiredprivate CachedUidGenerator cachedUidGenerator;/*** 获取uid** @return*/public long nextId() {return cachedUidGenerator.getUID();}/*** 格式化传入的uid,方便查看其实际含义** @param uid* @return*/public String parse(long uid) {return cachedUidGenerator.parseUID(uid);}
}

分布式全局唯一 ID生成器(百度UidGenerator)相关推荐

  1. Spring Boot 工程集成全局唯一ID生成器 Vesta

    2019独角兽企业重金招聘Python工程师标准>>> 本文内容脑图如下: 文章共 760字,阅读大约需要 2分钟 ! 概 述 在前一篇文章 <Spring Boot工程集成全 ...

  2. [分布式] ------ 全局唯一id生成之雪花算法(Twitter_Snowflake)

    雪花算法(Twitter_Snowflake) 我们知道,分布式全局唯一id的生成,一般是以下几种: 基于雪花算法生成 基于数据库 基于redis 基于zookeeper 本文说下雪花算法,后面附源码 ...

  3. Mysql系列七:分库分表技术难题之分布式全局唯一id解决方案

    Mysql系列七:分库分表技术难题之分布式全局唯一id解决方案 参考文章: (1)Mysql系列七:分库分表技术难题之分布式全局唯一id解决方案 (2)https://www.cnblogs.com/ ...

  4. java 唯一id生成算法_分布式全局唯一ID生成方案之snowflake算法

    已有的方案: 可大致分为: 完全依赖关系/非关系型数据库递增的方案 完全不依赖数据源作为生成因子的UUID 半依赖数据源作为生成因子的snowflake 为什么推荐snowflake? 这个问题,可以 ...

  5. java id生成器 分布式_分布式高效唯一ID生成器(sequence)

    分布式高效唯一ID生成器(sequence) 简介 高效GUID产生算法(sequence),基于Snowflake实现64位自增ID算法. Twitter-Snowflake算法产生的背景相当简单, ...

  6. 分布式全局唯一ID的实现

    分布式全局唯一ID的实现 前言 上周末考完试,这周正好把工作整理整理,然后也把之前的一些素材,整理一番,也当自己再学习一番. 一方面正好最近看到几篇这方面的文章,另一方面也是正好工作上有所涉及,所以决 ...

  7. 基于百度的UidGenerator改造的全局唯一id生成器

    其实百度的UidGenerator生成器也是基于snowflake算法的,在原生的项目中使用的基于数据库的,我改造成了基于zookpeer的,用zookpeer的序列号实现分布式seq的生成(代替了算 ...

  8. springboot项目创建全局唯一id生成器

    springboot项目创建全局唯一id生成方法,参考 Snowflake算法 yml文件 #app 全局唯一id生成 app:idGenerator:workerId: 1datacenterId: ...

  9. 全局唯一id生成器----Vesta

    引入依赖: <dependency><groupId>com.robert.vesta</groupId><artifactId>vesta-servi ...

最新文章

  1. 【实操】Y7000P 2020款安装黑苹果完整步骤记录
  2. ssl2331OJ1373-鱼塘钓鱼 之1【纯贪心】
  3. html js倒计时不准确,js倒计时代码:第2个倒计时为什么会不正常?
  4. TLE5012B磁编码器原理及优点,径向充磁磁铁的安装。AS5047、AS5048、AS5600、TLE5012、MA730
  5. %3c?php else:?%3e,[红日安全]代码审计Day15 - $_SERVER['PHP_SELF']导致的防御失效问题
  6. [BZOJ3124]直径
  7. 【源代码】Image Deformation Using Moving Least Squares算法的实现
  8. android获取按钮上的字,Android--在一个Button上显示不同类型的字体
  9. (四)Ubuntu 14.04 文件服务器--samba的安装和配置
  10. python遍历目录压缩文件夹_zip包含一个档案文件夹,如何使用Python获取存档中每个zip的注释?...
  11. 期末前端web大作业——基于HTML当当图书网项目的设计与实现 网上书城 网上书店 在线书店网页
  12. [uboot 移植]uboot 移植过程
  13. Java 10 大装 B 写法,装逼常用代码
  14. 物联网的原理、应用和技能
  15. 计算机登录界面没有用户显示不出来,笔记本电脑登录页面不显示 怎么解决
  16. 参加了feedsky的blog挑战赛
  17. 云锁和悬镜服务器哪个好,安全狗、悬镜、云锁、云帮手建议用哪个比较好?
  18. View被遮挡的解决办法
  19. 七夕了,给你的那个TA画上一箭倾心吧~
  20. 开源与标准协同发展研究报告(2022)

热门文章

  1. Li‘s 核磁共振影像数据处理-4-使用3D Slicer从DTI计算参数图(FA、ADC等)
  2. 网络基本功:http报文及TCP拥塞控制机制
  3. 四年云战争,华为打出了什么结果?
  4. 插图表格清单自动生成
  5. python2安装tensorflow,tensorflow 2.1.0 安装与实战教程(CASIA FACE v5)
  6. 吉林省计算机水平考试试题,2015吉林省计算机等级考试试题 二级ACCESS必过技巧...
  7. fopen 与 open 的区别
  8. 电脑桌面日历便签软件怎么通过月视图查看某一天的便签内容记录?
  9. 腾讯盛大百度版咆哮体
  10. 【图形学】光照模型-从最简单开始到BRDF实现