| @@ -45,7 +45,20 @@ | |||||
| <maven.compiler.target>1.8</maven.compiler.target> | <maven.compiler.target>1.8</maven.compiler.target> | ||||
| <java.version>1.8</java.version> | <java.version>1.8</java.version> | ||||
| </properties> | </properties> | ||||
| <dependencies> | |||||
| <dependency> | |||||
| <groupId>org.openjdk.jmh</groupId> | |||||
| <artifactId>jmh-core</artifactId> | |||||
| <version>1.21</version> | |||||
| <scope>provided</scope> | |||||
| </dependency> | |||||
| <dependency> | |||||
| <groupId>org.openjdk.jmh</groupId> | |||||
| <artifactId>jmh-generator-annprocess</artifactId> | |||||
| <version>1.21</version> | |||||
| <scope>provided</scope> | |||||
| </dependency> | |||||
| </dependencies> | |||||
| <build> | <build> | ||||
| <plugins> | <plugins> | ||||
| <plugin> | <plugin> | ||||
| @@ -1,8 +1,6 @@ | |||||
| package com.github.yitter.test; | package com.github.yitter.test; | ||||
| import com.github.yitter.contract.IIdGenerator; | |||||
| import com.github.yitter.idgen.YitIdHelper; | import com.github.yitter.idgen.YitIdHelper; | ||||
| import java.util.HashSet; | import java.util.HashSet; | ||||
| import java.util.Set; | import java.util.Set; | ||||
| @@ -0,0 +1,7 @@ | |||||
| JMH 基准测试 漂移算法 macbook pro 13(2020) i5 jdk1.8.0_301 | |||||
| ``` | |||||
| Benchmark Mode Cnt Score Error Units | |||||
| StartUpJmh.testGetPojo thrpt 40 58835.536 ± 535.605 ops/s | |||||
| StartUpJmh.testGetPojo avgt 40 ≈ 10⁻⁵ s/op | |||||
| ``` | |||||
| @@ -1,8 +1,6 @@ | |||||
| package com.github.yitter.test; | package com.github.yitter.test; | ||||
| import com.github.yitter.contract.IIdGenerator; | |||||
| import com.github.yitter.contract.IdGeneratorOptions; | import com.github.yitter.contract.IdGeneratorOptions; | ||||
| import com.github.yitter.idgen.DefaultIdGenerator; | |||||
| import com.github.yitter.idgen.YitIdHelper; | import com.github.yitter.idgen.YitIdHelper; | ||||
| public class StartUp { | public class StartUp { | ||||
| @@ -0,0 +1,62 @@ | |||||
| package com.github.yitter.test; | |||||
| import com.github.yitter.contract.IdGeneratorOptions; | |||||
| import com.github.yitter.idgen.YitIdHelper; | |||||
| import java.util.concurrent.TimeUnit; | |||||
| import org.openjdk.jmh.annotations.Benchmark; | |||||
| import org.openjdk.jmh.annotations.BenchmarkMode; | |||||
| import org.openjdk.jmh.annotations.Level; | |||||
| import org.openjdk.jmh.annotations.Mode; | |||||
| import org.openjdk.jmh.annotations.OutputTimeUnit; | |||||
| import org.openjdk.jmh.annotations.Scope; | |||||
| import org.openjdk.jmh.annotations.Setup; | |||||
| import org.openjdk.jmh.annotations.State; | |||||
| import org.openjdk.jmh.annotations.Threads; | |||||
| import org.openjdk.jmh.runner.Runner; | |||||
| import org.openjdk.jmh.runner.RunnerException; | |||||
| import org.openjdk.jmh.runner.options.Options; | |||||
| import org.openjdk.jmh.runner.options.OptionsBuilder; | |||||
| /** | |||||
| * @author suzhenyu | |||||
| * @date 2021/9/27 | |||||
| */ | |||||
| // 测试方法平均执行时间 | |||||
| @BenchmarkMode({Mode.All}) | |||||
| // 输出结果的时间粒度为微秒 | |||||
| @OutputTimeUnit(TimeUnit.MILLISECONDS) | |||||
| @State(Scope.Thread) | |||||
| //@Threads(2) | |||||
| public class StartUpJmh { | |||||
| //1-漂移算法,2-传统算法 | |||||
| final static short method = 1; | |||||
| public static void main(String[] args) throws RunnerException { | |||||
| Options options = new OptionsBuilder().include(StartUpJmh.class.getSimpleName()) | |||||
| .warmupIterations(1).measurementIterations(5).forks(1).build(); | |||||
| new Runner(options).run(); | |||||
| } | |||||
| /** | |||||
| * setup初始化容器的时候只执行一次 | |||||
| */ | |||||
| @Setup(Level.Trial) | |||||
| public void init() { | |||||
| IdGeneratorOptions options = new IdGeneratorOptions(); | |||||
| options.WorkerIdBitLength = 6; | |||||
| options.SeqBitLength = 10; | |||||
| options.BaseTime = System.currentTimeMillis(); | |||||
| options.Method = method; | |||||
| options.WorkerId = 1; | |||||
| // 首先测试一下 IdHelper 方法,获取单个Id | |||||
| YitIdHelper.setIdGenerator(options); | |||||
| YitIdHelper.nextId(); | |||||
| } | |||||
| @Benchmark | |||||
| public void testNextId() { | |||||
| YitIdHelper.nextId(); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,63 @@ | |||||
| package com.github.yitter.test; | |||||
| import com.github.yitter.contract.IdGeneratorOptions; | |||||
| import com.github.yitter.idgen.YitIdHelper; | |||||
| import java.util.concurrent.TimeUnit; | |||||
| import org.openjdk.jmh.annotations.Benchmark; | |||||
| import org.openjdk.jmh.annotations.BenchmarkMode; | |||||
| import org.openjdk.jmh.annotations.Level; | |||||
| import org.openjdk.jmh.annotations.Mode; | |||||
| import org.openjdk.jmh.annotations.OutputTimeUnit; | |||||
| import org.openjdk.jmh.annotations.Scope; | |||||
| import org.openjdk.jmh.annotations.Setup; | |||||
| import org.openjdk.jmh.annotations.State; | |||||
| import org.openjdk.jmh.annotations.Threads; | |||||
| import org.openjdk.jmh.runner.Runner; | |||||
| import org.openjdk.jmh.runner.RunnerException; | |||||
| import org.openjdk.jmh.runner.options.Options; | |||||
| import org.openjdk.jmh.runner.options.OptionsBuilder; | |||||
| /** | |||||
| * @author suzhenyu | |||||
| * @date 2021/9/27 | |||||
| */ | |||||
| // 测试方法平均执行时间 | |||||
| @BenchmarkMode({Mode.All}) | |||||
| // 输出结果的时间粒度为微秒 | |||||
| @OutputTimeUnit(TimeUnit.MILLISECONDS) | |||||
| @State(Scope.Thread) | |||||
| //@Threads(2) | |||||
| public class StartUpJmh2 { | |||||
| //1-漂移算法,2-传统算法 | |||||
| final static short method = 2; | |||||
| public static void main(String[] args) throws RunnerException { | |||||
| Options options = new OptionsBuilder().include(StartUpJmh2.class.getName() + ".*") | |||||
| .warmupIterations(1).measurementIterations(5).forks(2).build(); | |||||
| new Runner(options).run(); | |||||
| } | |||||
| /** | |||||
| * setup初始化容器的时候只执行一次 | |||||
| */ | |||||
| @Setup(Level.Trial) | |||||
| public void init() { | |||||
| IdGeneratorOptions options = new IdGeneratorOptions(); | |||||
| options.WorkerIdBitLength = 6; | |||||
| options.SeqBitLength = 10; | |||||
| options.BaseTime = System.currentTimeMillis(); | |||||
| options.Method = method; | |||||
| options.WorkerId = 1; | |||||
| // 首先测试一下 IdHelper 方法,获取单个Id | |||||
| YitIdHelper.setIdGenerator(options); | |||||
| YitIdHelper.nextId(); | |||||
| } | |||||
| @Benchmark | |||||
| public void testGetPojo() { | |||||
| YitIdHelper.nextId(); | |||||
| } | |||||
| } | |||||
| @@ -17,7 +17,7 @@ QQ群:646049993 | |||||
| ❄ 兼容所有雪花算法(号段模式或经典模式,大厂或小厂),将来你可做任意的升级切换。(一般无须升级,但理论上支持) | ❄ 兼容所有雪花算法(号段模式或经典模式,大厂或小厂),将来你可做任意的升级切换。(一般无须升级,但理论上支持) | ||||
| ❄ 这是计算机历史上最全面的雪花ID生成工具,期待你来超越😀 | |||||
| ❄ 这是计算机历史上最全面的雪花ID生成工具。 | |||||
| #### 需求来源 | #### 需求来源 | ||||
| @@ -108,7 +108,7 @@ QQ群:646049993 | |||||
| 387750301904971 (运行3年) | 387750301904971 (运行3年) | ||||
| 646093214093387 (运行5年) | 646093214093387 (运行5年) | ||||
| 1292658282840139 (运行10年) | 1292658282840139 (运行10年) | ||||
| 9007199254740992 (js Number 最大值) | |||||
| 9007199254740992 (js Number 最大值,可以支撑70年) | |||||
| 165399880288699493 (普通雪花算法生成的ID) | 165399880288699493 (普通雪花算法生成的ID) | ||||
| ``` | ``` | ||||
| @@ -160,7 +160,7 @@ QQ群:646049993 | |||||
| 第二版增加参数(非必须): | 第二版增加参数(非必须): | ||||
| ❄ ***DataCenterId***,数据中心ID(默认0),请确保全局唯一。 | |||||
| ❄ ***DataCenterId***,数据中心ID(机房ID,默认0),请确保全局唯一。 | |||||
| ❄ ***DataCenterIdBitLength***,数据中心ID长度(默认0)。 | ❄ ***DataCenterIdBitLength***,数据中心ID长度(默认0)。 | ||||
| @@ -211,7 +211,7 @@ QQ群:646049993 | |||||
| 🔍 当然,如果你的服务无需自动扩容,那就不必自动注册WorkerId,而是为它们分别设置全局唯一值。 | 🔍 当然,如果你的服务无需自动扩容,那就不必自动注册WorkerId,而是为它们分别设置全局唯一值。 | ||||
| 🔍 发挥你的想象力,方法还有很多。此处抛砖引玉:开发中心化的ID生成服务,由它为各端点服务(单个或批量)生成可用ID。 | |||||
| 🔍 方法还有很多,例如:开发中心化的ID生成服务,由它为各端点服务(单个或批量)生成可用ID。 | |||||
| #### 自动注册流程图 | #### 自动注册流程图 | ||||
| @@ -168,6 +168,53 @@ $ ts-node test/test4.ts | |||||
| 8 ID:30043877339570182 bigint 长度:17 | 8 ID:30043877339570182 bigint 长度:17 | ||||
| 9 ID:30043877339570183 bigint 长度:17 | 9 ID:30043877339570183 bigint 长度:17 | ||||
| <<<<<<< HEAD | |||||
| ======= | |||||
| ``` | |||||
| ## 同时兼容number和bigint的写法 | |||||
| 如果您觉得这个用法更好,可以手动替换对应方法 | |||||
| ```js | |||||
| /** | |||||
| * 生成ID | |||||
| * @returns | |||||
| */ | |||||
| public NextId(): number | bigint { | |||||
| if (this._IsOverCost) { | |||||
| // | |||||
| let id = this.NextOverCostId() | |||||
| if (id >= 9007199254740992n) | |||||
| return id | |||||
| else | |||||
| return parseInt(id.toString()) | |||||
| } else { | |||||
| // | |||||
| let id = this.NextNormalId() | |||||
| if (id >= 9007199254740992n) | |||||
| return id | |||||
| else | |||||
| return parseInt(id.toString()) | |||||
| } | |||||
| } | |||||
| >>>>>>> 91459b1538b24a03174b20eba10db410d8ef5268 | |||||
| ``` | ``` | ||||
| ## 其他帮助 | ## 其他帮助 | ||||
| @@ -372,7 +372,11 @@ export class snowflakeIdv1 { | |||||
| * 生成ID | * 生成ID | ||||
| * @returns 始终输出bigint类型 | * @returns 始终输出bigint类型 | ||||
| */ | */ | ||||
| <<<<<<< HEAD | |||||
| public NextBigId(): bigint { | public NextBigId(): bigint { | ||||
| ======= | |||||
| public NextId(): bigint { | |||||
| >>>>>>> 91459b1538b24a03174b20eba10db410d8ef5268 | |||||
| if (this._IsOverCost) { | if (this._IsOverCost) { | ||||
| // | // | ||||
| return this.NextOverCostId() | return this.NextOverCostId() | ||||