基于雪花算法实现增强版ID生成器详解
基于雪花算法的增强版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)
测试结果
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生成器详解的文章就介绍到这了,更多相关雪花算法实现ID生成器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
SpringBoot中@Scheduled实现服务启动时执行一次
本文主要介绍了SpringBoot中@Scheduled实现服务启动时执行一次,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2024-08-08Mybatis或Mybatis-Plus框架的xml文件中特殊符号的使用详解
这篇文章主要介绍了Mybatis或Mybatis-Plus框架的xml文件中特殊符号的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-11-11SpringBoot整合Springsecurity实现数据库登录及权限控制功能
本教程详细介绍了如何使用SpringBoot整合SpringSecurity实现数据库登录和权限控制,本文分步骤结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧2024-10-10详解SpringBoot项目整合Vue做一个完整的用户注册功能
本文主要介绍了SpringBoot项目整合Vue做一个完整的用户注册功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2022-07-07
最新评论