基于雪花算法實現(xiàn)增強(qiáng)版ID生成器詳解
基于雪花算法的增強(qiáng)版ID生成器
- 解決了時間回?fù)艿膯栴}
- 無需手動指定workId, 微服務(wù)環(huán)境自適應(yīng)
- 可配置化
快速開始
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.DefaultSequenceConfigio.github.mocreates.config.SimpleSequenceConfig
前者需要顯式地指定 workerId、datacenterId,可以結(jié)合數(shù)據(jù)庫來使用,后者是利用網(wǎng)卡信息進(jìn)行自適應(yīng)
詳情
| 字段名 | 釋義 | 默認(rèn)值 |
|---|---|---|
| twepoch | 可以被設(shè)置為最接近項目啟用前的某個時間點(unix 時間戳) | 1665817757000L |
| workerIdBits | 機(jī)器位所占的bit位數(shù) | 19L |
| datacenterIdBits | 數(shù)據(jù)標(biāo)識位所占的bit位數(shù) | 0L |
| sequenceBits | 毫秒內(nèi)自增位數(shù) | 3L |
| workerId | 機(jī)器位 | |
| datacenterId | 數(shù)據(jù)位 | 0L |
| inetAddress | 網(wǎng)絡(luò)相關(guān)信息 |
生產(chǎn)推薦使用方式
1.依賴引入
<dependency>
<groupId>io.github.mocreates</groupId>
<artifactId>uid-generator</artifactId>
<version>2.0-RELEASE</version>
</dependency>
2.創(chuàng)建表
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, 解決分布式環(huán)境下手動指定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 性能測試
測試機(jī)硬件情況
MacBook Pro (13-inch, M1, 2020) 8C 16G
Sequence 配置參數(shù)
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參數(shù)
@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)
測試結(jié)果
| Benchmark | Mode | Cnt | Score | Error | Units |
|---|---|---|---|---|---|
| SingleNodeSequenceTest.nextIdTest | thrpt | 10 | 27825573.565 ± 962298.054 | ops/s |
Tip
如果對qps性能要求較高,可以適當(dāng)調(diào)整sequenceBits
倉庫地址
https://github.com/mocreates/sequence
到此這篇關(guān)于基于雪花算法實現(xiàn)增強(qiáng)版ID生成器詳解的文章就介紹到這了,更多相關(guān)雪花算法實現(xiàn)ID生成器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springsecurity基于token的認(rèn)證方式
本文主要介紹了springsecurity基于token的認(rèn)證方式,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08
用html css javascript打造自己的RIA圖文教程
用html&css&javascript打造自己的RIA之一,包括了配置等2009-07-07
關(guān)于@ApiModel和@ApiModelProperty的使用
這篇文章主要介紹了關(guān)于@ApiModel和@ApiModelProperty的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11
java 重定義數(shù)組的實現(xiàn)方法(與VB的ReDim相像)
java 重定義數(shù)組的實現(xiàn)方法(與VB的ReDim相像),需要的朋友可以參考一下2013-04-04
spring-boot 如何實現(xiàn)單次執(zhí)行程序
這篇文章主要介紹了spring-boot 實現(xiàn)單次執(zhí)行程序方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
java 進(jìn)程是如何在Linux服務(wù)器上進(jìn)行內(nèi)存分配的
這篇文章主要介紹了java 進(jìn)程是如何在Linux服務(wù)器上進(jìn)行內(nèi)存分配的,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2020-11-11
使用AbstractRoutingDataSource實現(xiàn)數(shù)據(jù)源動態(tài)切換的實例
AbstractRoutingDataSource 是 Spring 框架提供的一個抽象類,用于實現(xiàn)動態(tài)數(shù)據(jù)源路由,這個類主要用于多數(shù)據(jù)源場景,其中可以根據(jù)不同的條件動態(tài)地切換到不同的數(shù)據(jù)源,本文給大家介紹了如何使用AbstractRoutingDataSource實現(xiàn)數(shù)據(jù)源動態(tài)切換,需要的朋友可以參考下2024-03-03

