From 422f36b23e7aae59386da86f87341a38fd5d8268 Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 13 May 2024 15:52:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0IdConstants=EF=BC=8C=E6=8F=90?= =?UTF-8?q?=E9=AB=98Snowflake=E5=88=9D=E5=A7=8B=E5=8C=96=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 3 +- .../java/cn/hutool/core/lang/Snowflake.java | 9 +++--- .../cn/hutool/core/lang/id/IdConstants.java | 31 +++++++++++++++++++ 3 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 hutool-core/src/main/java/cn/hutool/core/lang/id/IdConstants.java diff --git a/CHANGELOG.md b/CHANGELOG.md index c961dc5fa..a15315f07 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ # 🚀Changelog ------------------------------------------------------------------------------------------------------------- -# 5.8.28(2024-05-11) +# 5.8.28(2024-05-13) ### 🐣新特性 * 【core 】 修正XmlUtil的omitXmlDeclaration描述注释(issue#I9CPC7@Gitee) @@ -19,6 +19,7 @@ * 【core 】 PropertyComparator增加compareSelf构造重载(issue#3569@Github) * 【db 】 增加OceanBase的driver推断(pr#1217@Gitee) * 【http 】 HttpRequest#get不再尝试File路径(issue#I9O6DA@Gitee) +* 【core 】 增加IdConstants,提高Snowflake初始化性能(issue#3581@Github) ### 🐞Bug修复 * 【http 】 修复HttpUtil.urlWithFormUrlEncoded方法重复编码问题(issue#3536@Github) diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/Snowflake.java b/hutool-core/src/main/java/cn/hutool/core/lang/Snowflake.java index 84ae4e7c3..7e7f76d12 100755 --- a/hutool-core/src/main/java/cn/hutool/core/lang/Snowflake.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/Snowflake.java @@ -1,6 +1,7 @@ package cn.hutool.core.lang; import cn.hutool.core.date.SystemClock; +import cn.hutool.core.lang.id.IdConstants; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; @@ -48,11 +49,11 @@ public class Snowflake implements Serializable { private static final long WORKER_ID_BITS = 5L; // 最大支持机器节点数0~31,一共32个 @SuppressWarnings({"PointlessBitwiseExpression", "FieldCanBeLocal"}) - private static final long MAX_WORKER_ID = -1L ^ (-1L << WORKER_ID_BITS); + public static final long MAX_WORKER_ID = -1L ^ (-1L << WORKER_ID_BITS); private static final long DATA_CENTER_ID_BITS = 5L; // 最大支持数据中心节点数0~31,一共32个 @SuppressWarnings({"PointlessBitwiseExpression", "FieldCanBeLocal"}) - private static final long MAX_DATA_CENTER_ID = -1L ^ (-1L << DATA_CENTER_ID_BITS); + public static final long MAX_DATA_CENTER_ID = -1L ^ (-1L << DATA_CENTER_ID_BITS); // 序列号12位(表示只允许workId的范围为:0-4095) private static final long SEQUENCE_BITS = 12L; // 机器节点左移12位 @@ -93,7 +94,7 @@ public class Snowflake implements Serializable { * 构造,使用自动生成的工作节点ID和数据中心ID */ public Snowflake() { - this(IdUtil.getWorkerId(IdUtil.getDataCenterId(MAX_DATA_CENTER_ID), MAX_WORKER_ID)); + this(IdConstants.DEFAULT_WORKER_ID); } /** @@ -102,7 +103,7 @@ public class Snowflake implements Serializable { * @param workerId 终端ID */ public Snowflake(long workerId) { - this(workerId, IdUtil.getDataCenterId(MAX_DATA_CENTER_ID)); + this(workerId, IdConstants.DEFAULT_DATACENTER_ID); } /** diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/id/IdConstants.java b/hutool-core/src/main/java/cn/hutool/core/lang/id/IdConstants.java new file mode 100644 index 000000000..72fbb4be1 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/lang/id/IdConstants.java @@ -0,0 +1,31 @@ +package cn.hutool.core.lang.id; + +import cn.hutool.core.lang.Snowflake; +import cn.hutool.core.util.IdUtil; + +/** + * ID相关常量 + * + * @author Looly + * @since 5.8.28 + */ +public class IdConstants { + /** + * 默认的数据中心ID。 + *

此常量通过调用{@link IdUtil#getDataCenterId(long)}方法,传入{@link Snowflake#MAX_DATA_CENTER_ID}作为参数, + * 来获取一个默认的数据中心ID。它在系统中作为一个全局配置使用,标识系统默认运行在一个最大数据中心ID限定的环境中。

+ * + * @see IdUtil#getDataCenterId(long) + * @see Snowflake#MAX_DATA_CENTER_ID + */ + public static final long DEFAULT_DATACENTER_ID = IdUtil.getDataCenterId(Snowflake.MAX_DATA_CENTER_ID); + + /** + * 默认的Worker ID生成。 + *

这个静态常量是通过调用IdUtil的getWorkerId方法,使用默认的数据中心ID和Snowflake算法允许的最大Worker ID来获取的。

+ * + * @see IdUtil#getWorkerId(long, long) 获取Worker ID的具体实现方法 + * @see Snowflake#MAX_WORKER_ID Snowflake算法中定义的最大Worker ID + */ + public static final long DEFAULT_WORKER_ID = IdUtil.getWorkerId(DEFAULT_DATACENTER_ID, Snowflake.MAX_WORKER_ID); +}