基于雪花算法實(shí)現(xiàn)增強(qiáng)版ID生成器詳解
基于雪花算法的增強(qiáng)版ID生成器
- 解決了時(shí)間回?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(); }
配置解析
目前提供兩個(gè)配置類
io.github.mocreates.config.DefaultSequenceConfig
io.github.mocreates.config.SimpleSequenceConfig
前者需要顯式地指定 workerId、datacenterId,可以結(jié)合數(shù)據(jù)庫來使用,后者是利用網(wǎng)卡信息進(jìn)行自適應(yīng)
詳情
字段名 | 釋義 | 默認(rèn)值 |
---|---|---|
twepoch | 可以被設(shè)置為最接近項(xiàng)目啟用前的某個(gè)時(shí)間點(diǎn)(unix 時(shí)間戳) | 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的痛點(diǎn))
@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)于基于雪花算法實(shí)現(xiàn)增強(qiáng)版ID生成器詳解的文章就介紹到這了,更多相關(guān)雪花算法實(shí)現(xiàn)ID生成器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot中@Scheduled實(shí)現(xiàn)服務(wù)啟動時(shí)執(zhí)行一次
本文主要介紹了SpringBoot中@Scheduled實(shí)現(xiàn)服務(wù)啟動時(shí)執(zhí)行一次,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-08-08SpringAOP實(shí)現(xiàn)自定義接口權(quán)限控制
本文主要介紹了SpringAOP實(shí)現(xiàn)自定義接口權(quán)限控制,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11mybatis實(shí)現(xiàn)mapper代理模式的方式
本文向大家講解mybatis的mapper代理模式,以根據(jù)ide值查詢單條數(shù)據(jù)為例編寫xml文件,通過mapper代理的方式進(jìn)行講解增刪改查,分步驟給大家講解的很詳細(xì),對mybatis mapper代理模式相關(guān)知識感興趣的朋友一起看看吧2021-06-06Mybatis或Mybatis-Plus框架的xml文件中特殊符號的使用詳解
這篇文章主要介紹了Mybatis或Mybatis-Plus框架的xml文件中特殊符號的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Java如何實(shí)現(xiàn)一個(gè)簡化版的Stream框架
這篇文章主要為大家詳細(xì)介紹了一個(gè)簡化版的 Stream 實(shí)現(xiàn),展示了如何通過延遲執(zhí)行來處理數(shù)據(jù)流,感興趣的小伙伴可以跟隨小編一學(xué)習(xí)一下2024-10-10SpringBoot整合Springsecurity實(shí)現(xiàn)數(shù)據(jù)庫登錄及權(quán)限控制功能
本教程詳細(xì)介紹了如何使用SpringBoot整合SpringSecurity實(shí)現(xiàn)數(shù)據(jù)庫登錄和權(quán)限控制,本文分步驟結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-10-10詳解SpringBoot項(xiàng)目整合Vue做一個(gè)完整的用戶注冊功能
本文主要介紹了SpringBoot項(xiàng)目整合Vue做一個(gè)完整的用戶注冊功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07