如何在Java服务中实现分布式ID生成:雪花算法与UUID的对比

news/2025/1/15 12:54:55/文章来源:https://www.cnblogs.com/szk123456/p/18403628

如何在Java服务中实现分布式ID生成:雪花算法与UUID的对比

大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代分布式系统中,唯一标识符(ID)的生成是一个关键问题。常见的ID生成方案包括雪花算法(Snowflake)和UUID(通用唯一识别码)。本文将对这两种方案进行详细对比,并提供在Java服务中实现它们的示例代码。

一、UUID(通用唯一识别码)

1.1 UUID概述

UUID是一个128位长的唯一标识符,通常以16进制格式表示。UUID广泛应用于需要唯一标识符的场景,如数据库主键、会话ID等。UUID的优点是生成简单且具有全球唯一性,但在分布式系统中可能会遇到性能问题和存储开销较大的问题。

1.2 使用Java生成UUID

在Java中,可以使用java.util.UUID类来生成UUID:

package cn.juwatech.uuid;import java.util.UUID;public class UUIDGenerator {public static void main(String[] args) {UUID uuid = UUID.randomUUID();System.out.println("Generated UUID: " + uuid.toString());}
}

1.3 UUID的缺点

  • 性能问题: UUID的生成不依赖于时间戳或序列,因此在高并发情况下可能出现性能瓶颈。
  • 存储开销: UUID的长度为128位(16字节),在数据库中存储时可能会占用较多空间。

二、雪花算法(Snowflake)

2.1 雪花算法概述

雪花算法是由Twitter开发的一种生成分布式唯一ID的算法,生成的ID是64位长的数字。雪花算法在保证唯一性的同时,具有高性能和较小的存储开销。雪花算法的ID包含时间戳、机器ID和序列号等部分,用于保证ID的唯一性和排序性。

2.2 雪花算法的ID结构

雪花算法生成的ID由以下几部分组成:

  • 时间戳(41位): 当前时间的毫秒数,确保ID的时间顺序性。
  • 机器ID(10位): 用于区分不同的机器节点。
  • 序列号(12位): 用于同一节点的同一毫秒内生成多个ID。

2.3 Java实现雪花算法

以下是一个简单的雪花算法实现:

package cn.juwatech.snowflake;public class SnowflakeIdGenerator {private final long epoch = 1288834974657L; // 自定义的起始时间戳private final long machineIdBits = 5L; // 机器ID位数private final long sequenceBits = 12L; // 序列号位数private final long maxMachineId = -1L ^ (-1L << machineIdBits); // 最大机器IDprivate final long sequenceMask = -1L ^ (-1L << sequenceBits); // 最大序列号private long machineId; // 机器IDprivate long sequence = 0L; // 当前序列号private long lastTimestamp = -1L; // 上次时间戳public SnowflakeIdGenerator(long machineId) {if (machineId > maxMachineId || machineId < 0) {throw new IllegalArgumentException("Machine ID must be between 0 and " + maxMachineId);}this.machineId = machineId;}public synchronized long nextId() {long timestamp = System.currentTimeMillis();if (timestamp < lastTimestamp) {throw new RuntimeException("Clock moved backwards. Refusing to generate id");}if (timestamp == lastTimestamp) {sequence = (sequence + 1) & sequenceMask;if (sequence == 0) {timestamp = waitForNextMillis(lastTimestamp);}} else {sequence = 0;}lastTimestamp = timestamp;return ((timestamp - epoch) << (machineIdBits + sequenceBits))| (machineId << sequenceBits)| sequence;}private long waitForNextMillis(long lastTimestamp) {long timestamp = System.currentTimeMillis();while (timestamp <= lastTimestamp) {timestamp = System.currentTimeMillis();}return timestamp;}public static void main(String[] args) {SnowflakeIdGenerator generator = new SnowflakeIdGenerator(1);System.out.println("Generated Snowflake ID: " + generator.nextId());}
}

2.4 雪花算法的优点

  • 高性能: 雪花算法通过减少ID生成的冲突,显著提高了生成速度。
  • 较小的存储开销: 生成的ID为64位,存储空间比UUID小。

三、UUID与雪花算法的对比

3.1 性能对比

  • UUID: UUID生成速度较快,但在高并发场景下可能会成为瓶颈。
  • 雪花算法: 雪花算法的生成速度较快,且在高并发环境下表现更加稳定。

3.2 存储开销

  • UUID: UUID占用16字节(128位),在数据库中存储时占用空间较大。
  • 雪花算法: 雪花算法生成的ID占用8字节(64位),存储开销较小。

3.3 唯一性和排序性

  • UUID: UUID保证全球唯一性,但不保证有序性。
  • 雪花算法: 雪花算法生成的ID不仅保证唯一性,还具有时间排序性。

四、总结

在Java服务中选择合适的ID生成方案对于系统的性能和数据管理至关重要。UUID适用于生成简单且全球唯一的标识符,而雪花算法则更适合需要高性能和较小存储开销的场景。根据具体的应用需求,合理选择和优化ID生成策略,将有助于提升系统的整体效率。

本文著作权归聚娃科技微赚淘客系统开发者团队,转载请注明出处!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/794223.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

02网络参考模型

02网络参考模型02网络参考模型常见网络模型因为 OSI协议栈比较复杂 ,且TCP和IP两大协议在业界被广泛使用,所以 TCP/IP参考模型 成为了互联网的主流参考模型。OIS网络模型层级作用7.应用层 应用层 对应用程序提供接口。6.表示层进行数据格式的转换,以确保一个系统生成的应用层…

《痞子衡嵌入式半月刊》 第 107 期

痞子衡嵌入式半月刊: 第 107 期这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻,农历年分二十四节气,希望在每个交节之日准时发布一期。 本期刊是开源项目(GitHub: JayHeng/pzh-mcu-bi-weekly),欢迎提交 issue,投稿或推荐你知道的嵌入式那些事儿。 上期回顾 :《…

鼠标悬停显示的轮播图

今日整理,发现这种轮播图是最难实现的一种, 1.再循环中难以控制单一品类商品显示 解决办法: 在外面的主类里面添加&:hover触发标签属性的更改,这样可以单一作用 2.在循环中触发事件,所有的同一事件都会触发 解决办法:先建立模版控制排版,再从单一内容开始微调 <script s…

如何把网页的公式优雅地拷贝到word中:数学公式识别神器—Mathpix Snip

这个编辑器其实在把chatgpt的公式粘贴到word中时就已经使用了,用的是网页版。 现在下载了软件(但是好像一个月试用期过后得收费?但是就目前来说,体验感真的超级好) 把公式复制粘贴转成mathtype公式 可以截取电脑屏幕上的图像,如果图像上面有公式的话,就会识别,之后可以…

Redis 入门 - 图形化管理工具如何选择,最全分类

Redis图形化管理工具可分为四类:命令行工具、桌面客户端工具、网页工具、插件工具。看看哪一款适合你呢?工欲善其事必先利其器,上一章Redis服务环境已经搭建完成,现在就需要一个趁手的工具,有个好工具可以做到事半功倍。 Redis图形化管理工具五花八门,可供选择的很多,大…

Javaweb-事务

注意在当前窗口是修改了的:而在其他窗口是不修改的:select @@autocommit;修改为手动提交:

格路计数

前言 完全借鉴于 洛谷日报 前提条件 在一个网格图上, 每一次可以从 \((x,y)\) 走到 \((x+1,y-1)\) 或者 \((x+1,y-1)\) 限制是一条直线 \(y=k\) 题外话 我们其实可以发现这和每一次可以从 \((x,y)\) 走到 \((x+1,y)\) 或者 \((x, y+1)\) 限制是一条 \(45\)的斜线 \(y=x+k\) 是等…

9.2-9.8 总结

zhicheng123456做题 因为联考众多,所以说只有不多的做题。主要得知了两个结论:找树剖到根的轻链(动态)的方法和把线段(均匀随机分界点)分为 \(n\) 段的 \(k\) 短值的计算。 联考:https://www.cnblogs.com/british-union/p/liankao.html 还是时常在简单的东西上失败,但是…

第一章预习作业

第一周预习报告 学习内容《WindowsC/C++加密解密实战》第1,2章 第一章概念复习 第二章主要在Linux(Ubuntu,openEuler)上把软件更新到最新版(3.0版本以上),如果默认不是,参考下面脚本。 AI对学习内容的总结 要求 让AI(kimi,元宝等)阅读学习内容并进行总结,教材内容可使…

9月第一周漏洞学习

蜂信物联(FastBee)物联网平台download存在任意文件下载漏洞 漏洞描述 FastBee是一款开源物联网平台,致力于为全球开发者提供稳定、搞笑的物联网解决方案。FastBee在download接口中存在任意文件下载漏洞,可能导致敏感信息泄露、数据盗窃及其他安全风险,从而对系统和用户造成…

AtCoder Beginner Contest 252 A~G 题解

前言这是我第一次写7题(A~G)的ABC题解,若有写得不好或者不到位的地方请多多指教,我将万分感激,感谢大家的支持!A - ASCII code 题目大意 给定正整数\(N\),输出ASCII码是\(N\)的字母。 \(97\le N\le 122\) 输入格式 \(N\) 输出格式 输出ASCII码是\(N\)的字母。 分析 注意…

苯乙烯

周线 日线: 60分钟: 短线看能否走出下跌五浪吧:观望