sequence

基于雪花算法的增强版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);
}
  1. 使用序列器生成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';
  1. 配置 (利用主键自增来分配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);
}
  1. 使用序列器生成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)

测试结果

Benchmark Mode Cnt Score Error Units
SingleNodeSequenceTest.nextIdTest thrpt 10 27825573.565 ± 962298.054 ops/s

Tip

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

仓库地址

https://github.com/mocreates/sequence

基于雪花算法的增强版ID生成器的更多相关文章

  1. 一个类似 Twitter 雪花算法 的 连续序号 ID 产生器 SeqIDGenerator

    项目地址 :     https://github.com/kelin-xycs/SeqIDGenerator 今天 QQ 群 里有网友问起产生唯一 ID 的方法 有哪些,  讨论了各种方法 . 有网 ...

  2. 基于雪花算法生成分布式ID(Java版)

    SnowFlake算法原理介绍 在分布式系统中会将一个业务的系统部署到多台服务器上,用户随机访问其中一台,而之所以引入分布式系统就是为了让整个系统能够承载更大的访问量.诸如订单号这些我们需要它是全局唯 ...

  3. 雪花算法(snowflake)delphi版

    雪花算法简单描述: + 最高位是符号位,始终为0,不可用. + 41位的时间序列,精确到毫秒级,41位的长度可以使用69年.时间位还有一个很重要的作用是可以根据时间进行排序. + 10位的机器标识,1 ...

  4. snowflake 雪花算法 分布式实现全局id生成

    snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID. 这种方案大致来说是一种以划分命名空间(UUID也算,由于比较常见,所以单独分析)来生成ID的一种算法,这种方案 ...

  5. java 雪花算法实现获取分布式id

    import java.lang.management.ManagementFactory; import java.net.InetAddress; import java.net.NetworkI ...

  6. Twitter的分布式自增ID算法snowflake(雪花算法) - C#版

    概述 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的.有些时候我们希望能使用一种简 ...

  7. 雪花算法生成全局唯一ID

    系统中某些场景少不了全局唯一ID的使用,来保证数据的唯一性.除了通过数据库自带的自增id来保证 id 的唯一性,通常为了保证的数据的可移植性会选择通过程序生成全局唯一 id.百度了不少php相关的生成 ...

  8. 主键生成器效率提升方案|基于雪花算法和Redis控制进程隔离

    背景 主键生成效率用数据库自增效率也是比较高的,为什么要用主键生成器呢?是因为需要insert主表和明细表时,明细表有个字段是主表的主键作为关联.所以就需要先生成主键填好主表明细表的信息后再一次过在一 ...

  9. 全局ID生成--雪花算法

    分布式ID常见生成策略: 分布式ID生成策略常见的有如下几种: 数据库自增ID. UUID生成. Redis的原子自增方式. 数据库水平拆分,设置初始值和相同的自增步长. 批量申请自增ID. 雪花算法 ...

随机推荐

  1. ora-26002:Informatica的Powercenter跑ETL时,出现ora-26002错误解决办法

    在使用Informatica进行ETL导数的时候,出现下面的错误: WRT_8229 Database errors occurred: ORA-26002: Table REPORT.TB_JK_0 ...

  2. GP查询表状态常用SQL

  3. 11. MGR技术架构及数据同步、认证机制 | 深入浅出MGR

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. GreatSQL是MySQL的国产分支版本,使用上与MySQL一致. 目录 1. MGR架构 2. 事务数据同步.认证过程 ...

  4. 羽夏看Linux内核——门相关入门知识

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作.如想转载,请把我的转载信息附在文章后面,并 ...

  5. axios post请求变为options请求的解决方法

    全局配置 axios.defaults.headers['Content-Type']='application/x-www-form-urlencoded' 注意:使用全局配置会导致所有请求头的'C ...

  6. C#实现访问OPC UA服务器

    OPC UA服务器支持三种认证方式,分别是匿名认证.用户认证和证书认证.其中匿名认证安全等级最低,访问不做任何校验.用户认证访问时,OPC UA客户端需要提供用户名及密码认证,只有用户名和密码正确才允 ...

  7. 哈工大软件构造Lab3(2022)

    (防扒小助手) 本人CSDN博客: https://blog.csdn.net/m0_61753302 本人博客园博客(同步CSDN): 何以牵尘 - 博客园 (cnblogs.com)https:/ ...

  8. 第十三章 k8s的GUI资源管理插件--dashboard

    1.部署Kubernetes-dashboard 1.1 准备dashboard镜像 在10.4.7.200上操作 [root@hdss7-200 ~]# docker pull k8scn/kube ...

  9. Netty整合STOMP

    1.STOMP协议简介 常用的WebSocket协议定义了两种传输信息类型:文本信息和二进制信息.类型虽然被确定,但是他们的传输体是没有规定的,也就是说传输体可以自定义成什么样的数据格式都行,只要客户 ...

  10. KingbaseES blob 类型数据导入导出

    KingbaseES兼容了oracle的blob数据类型.通常是用来保存二进制形式的大数据,也可以用来保存其他类型的数据. 下面来验证一下各种数据存储在数据库中形式. 建表 create table ...