分布式ID生成算法:雪花算法(Snowflake)与UUID详解

在分布式系统中,唯一标识符(Unique Identifier, UID)的生成是一个至关重要的环节。UID不仅用于区分不同的实体对象,还可能涉及到事务处理、数据索引等众多方面。随着微服务架构的普及,传统的基于数据库自增主键的方式已经不能满足高并发环境下的需求。因此,诸如雪花算法(Snowflake)和UUID等分布式ID生成算法应运而生。本文将详细介绍这两种算法,并探讨它们在实际业务场景中的应用。

一、雪花算法(Snowflake)

概念

雪花算法是由Twitter开发的一种分布式ID生成算法,其目的是为了生成一个全局唯一的64位整数作为ID。该算法将这个64位整数分为以下几个部分:

  • 符号位:固定为0,表示正数;
  • 时间戳:41位,可以使用约69年(从2010年开始),之后会循环;
  • 工作机器ID:10位,支持部署在同一时间线上的不同服务器,最多支持1024个节点;
  • 序列号:12位,用来解决同一毫秒内产生的多个ID的问题,最多支持每个工作机器ID每毫秒产生4096个ID。

特点

  • 高性能:无需依赖数据库或其他中心化服务,生成速度快,适合高并发场景。
  • 唯一性:结合时间戳、机器ID和序列号,确保生成的ID具有全局唯一性。
  • 可排序:由于包含时间戳信息,生成的ID具备一定的可排序性,有助于优化存储和查询效率。

应用场景

在电商行业中,订单号的生成是一个典型的应用场景。由于订单生成频繁且需要保证唯一性,采用雪花算法可以快速生成不重复的订单号,同时支持水平扩展以应对大促期间的流量高峰。

二、UUID

概念

通用唯一识别码(Universally Unique Identifier, UUID)是一种软件构造的事物的唯一标识符,通常由32个十六进制数字组成,形式为8-4-4-4-12的格式。UUID由以下几部分构成:

  • 时间戳;
  • 时钟序列;
  • 节点标识(通常是MAC地址)。

根据版本不同,UUID的生成方式也有差异,例如:

  • Version 1:基于时间戳和硬件地址;
  • Version 4:完全随机生成;
  • Version 5:通过哈希算法基于命名空间和名称生成。

特点

  • 平台无关性:可以在任何操作系统或编程环境中实现。
  • 完全随机性:特别是Version 4,几乎可以保证ID的唯一性,但不具有可排序性。
  • 可配置性:可以根据具体需求选择不同的版本来适应不同的场景。

应用场景

在云计算环境中,UUID常用于虚拟机实例或容器的唯一标识。由于云平台可能跨越多个数据中心,使用UUID可以帮助避免因网络延迟等原因导致的ID冲突问题。

总结

无论是雪花算法还是UUID,在分布式系统中都有其独特的价值。选择哪种方法取决于具体的业务需求和技术约束。例如,在需要保证ID有序排列以及高性能的情况下,雪花算法可能更为合适;而在跨平台或多语言开发中,或者当需要最大程度地保证唯一性而不关心排序时,UUID则是一个更好的选择。

通过上述介绍,我们可以看到分布式ID生成算法的重要性及其在实际业务中的广泛应用。随着技术的发展,未来可能会有更多创新的方法出现,但掌握现有技术原理仍然是理解分布式系统设计的关键之一。

三、Java代码实现

(一)雪花算法实现

首先,我们需要定义一个雪花算法的实现类。这里简化了一些细节,如没有考虑时钟回拨等问题,但在实际生产环境中应当加入这些处理逻辑。

java

深色版本

import java.util.concurrent.ThreadLocalRandom;public class SnowflakeIdGenerator {private static final long EPOCH = 1288834974657L; // 自定义的时间起点private static final int WORKER_ID_BITS = 5;private static final int DATA_CENTER_ID_BITS = 5;private static final int SEQUENCE_BITS = 12;private static final long MAX_WORKER_ID = -1L ^ (-1L << WORKER_ID_BITS);private static final long MAX_DATA_CENTER_ID = -1L ^ (-1L << DATA_CENTER_ID_BITS);private static final long SEQUENCE_MASK = -1L ^ (-1L << SEQUENCE_BITS);private static final long WORKER_ID_SHIFT = SEQUENCE_BITS;private static final long DATA_CENTER_ID_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS;private static final long TIMESTAMP_LEFT_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS + DATA_CENTER_ID_BITS;private static final long SEQUENCE = 0L;private static final ThreadLocalRandom RANDOM = ThreadLocalRandom.current();private long lastTimestamp = -1L;private int workerId;private int dataCenterId;private long sequence = SEQUENCE;public SnowflakeIdGenerator(int workerId, int dataCenterId) {if (workerId > MAX_WORKER_ID || workerId < 0) {throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", MAX_WORKER_ID));}if (dataCenterId > MAX_DATA_CENTER_ID || dataCenterId < 0) {throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", MAX_DATA_CENTER_ID));}this.workerId = workerId;this.dataCenterId = dataCenterId;}public synchronized long nextId() {long timestamp = timeGen();if (timestamp < lastTimestamp) {throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));}if (lastTimestamp == timestamp) {sequence = (sequence + 1) & SEQUENCE_MASK;if (sequence == 0) {timestamp = tilNextMillis(lastTimestamp);}} else {sequence = 0;}lastTimestamp = timestamp;return ((timestamp - EPOCH) << TIMESTAMP_LEFT_SHIFT) |(dataCenterId << DATA_CENTER_ID_SHIFT) |(workerId << WORKER_ID_SHIFT) |sequence;}protected long tilNextMillis(long lastTimestamp) {long timestamp = timeGen();while (timestamp <= lastTimestamp) {timestamp = timeGen();}return timestamp;}protected long timeGen() {return System.currentTimeMillis();}
}

使用示例:

java

深色版本

public class Main {public static void main(String[] args) {SnowflakeIdGenerator generator = new SnowflakeIdGenerator(1, 1); // 工作机器ID为1,数据中心ID为1for (int i = 0; i < 10; i++) {System.out.println(generator.nextId());}}
}

(二)UUID实现

UUID的实现非常简单,Java自带的java.util.UUID类提供了现成的方法来生成UUID。

java

深色版本

import java.util.UUID;public class UUIDGenerator {public static String generateUUID() {return UUID.randomUUID().toString();}public static void main(String[] args) {for (int i = 0; i < 10; i++) {System.out.println(generateUUID());}}
}

以上就是使用Java语言实现雪花算法和UUID的基本代码示例。当然,在实际应用中,还需要考虑到更多的异常情况处理和性能优化。希望这些示例能帮助大家更好地理解和使用这些算法。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

个人网站,怎么操作才能提升个人网站的流量

运营个人网站以提升流量是一个综合性的过程&#xff0c;涉及内容优化、技术调整、用户体验提升以及外部推广等多个方面。以下是一些专业建议&#xff0c;旨在帮助个人网站运营者有效提升网站流量&#xff1a; 1.精准关键词研究与优化 -关键词研究&#xff1a;利用工具如谷歌…

【YOLO学习】YOLOv3详解

文章目录 1. 网络结构1.1 结构介绍1.2 改进 2. 训练与测试过程3. 总结 1. 网络结构 1.1 结构介绍 1. 与 YOLOv2 不同的是&#xff0c;YOLOv3 在 Darknet-19 里加入了 ResNet 残差连接&#xff0c;改进之后的模型叫 Darknet-53。在 ImageNet上 实验发现 Darknet-53 相对于 ResN…

数据结构与算法篇(树 - 常见术语)

目录 一、什么是树&#xff1f; 二、相关术语 根结点 边 叶子结点 兄弟结点 祖先结点 结点的大小 树的层 结点的深度 结点的高度 树的高度 斜树 一、什么是树&#xff1f; 树是一种类似于链表的数据结构&#xff0c;不过链表的结点是以线性方式简单地指向其后继结…

ORB-SLAM复现时遇到的问题(复现失败,切莫当做教程)

背景 本人的环境&#xff1a;使用ubuntu20.04&#xff0c;opencv4 问题 进行Build DBoW2. Go into Thirdparty/DBoW2/ and execute:时&#xff0c;运行make时出错 我安装的opencv4&#xff0c;在 OpenCV 3 和更高版本中&#xff0c;头文件的路径可能已更改。例如&#xff0…

[单master节点k8s部署]32.ceph分布式存储(三)

基于ceph rbd生成pv 在集群中认证ceph 用下面代码生成ceph的secret .创建 ceph 的 secret&#xff0c;在 k8s 的控制节点操作&#xff1a; 回到 ceph 管理节点创建 pool 池&#xff1a; [rootmaster1-admin ~]# ceph osd pool create k8stest 56 pool k8stest created [rootm…

免费音频剪辑软件大揭秘:让声音创作更轻松

在精神娱乐越发丰富的现在&#xff0c;音频内容的创作和编辑变得越来越重要。无论是专业的音乐制作人&#xff0c;还是自媒体创作者&#xff0c;都可能需要一款功能强大且易于使用的音频剪辑软件来处理音频素材。今天我们一同来探讨有什么好用的免费音频剪辑软件吧。 1.福昕音…

golang gin入门

gin是个小而精的web开发框架 官方文档 安装 go get -u github.com/gin-gonic/gin最简单的起手代码 package mainimport ("net/http""github.com/gin-gonic/gin" )func main() {r : gin.Default()r.GET("/ping", func(c *gin.Context) {c.JSON…

Java IO流全面教程

此笔记来自于B站黑马程序员 File 创建对象 public class FileTest1 {public static void main(String[] args) {// 1.创建一个 File 对象&#xff0c;指代某个具体的文件// 路径分隔符// File f1 new File("D:/resource/ab.txt");// File f1 new FIle("D:\\…

nodejs 构建高性能服务器的关键技术

nodejs 构建高性能服务器的关键技术 演示地址 演示地址 源码地址 源码地址 获取更多 获取更多 在现代 Web 开发中&#xff0c;Node.js 已成为构建高性能、可扩展网络应用的首选平台之一。它的非阻塞 I/O 模型与事件驱动架构使其能够在处理大量并发请求时表现出色&#xff0…

【C++11】新特性

前言&#xff1a; C11 是C编程语言的一个重要版本&#xff0c;于2011年发布。它带来了数量可观的变化&#xff0c;包含约 140 个新特性&#xff0c;以及对 C03 标准中约600个缺陷的修正&#xff0c;更像是从 C98/03 中孕育出的新语言 列表初始化 C11 中的列表初始化&#xff0…

【自用】王道文件管理强化笔记

文章目录 操作系统引导:磁盘初始化文件打开过程角度1文件的打开过程角度2 内存映射的文件访问 操作系统引导: ①CPU从一个特定主存地址开始&#xff0c;取指令&#xff0c;执行ROM中的引导程序(先进行硬件自检&#xff0c;再开机) ②)将磁盘的第一块–主引导记录读入内存&…

谷粒商城のRabbitMQ基础篇

文章目录 前言一、Rabbit MQ简介1、基本概念2、组件架构 二、使用步骤1.引入依赖2.application.properties3、docker 安装Rabbit MQ3、使用案例3.1、定义队列3.2、定义交换机3.3、绑定3.4、发送消息3.5、接受消息3.5、自定义消息序列化方式3.6、演示Fanout 交换机模式3.7、演示…

Vue基础(二)

计算属性与监视姓名案例 插值语法实现 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>姓名案例&l…

用人工智能写作:专业作家利用 ChatGPT 的五种方式 ✍️

用人工智能写作&#xff1a;专业作家利用 ChatGPT 的五种方式 &#x1f3a8;✍️ 在写作领域&#xff0c;人工智能工具如 ChatGPT 正逐渐成为作家们的得力助手。它不仅帮助优化文本&#xff0c;还能激发灵感、完善叙事结构&#xff0c;甚至推动创新。本文将通过五个具体案例&a…

【微服务】服务注册与发现 - Eureka(day3)

CAP理论 P是分区容错性。简单来说&#xff0c;分区容错性表示分布式服务中一个节点挂掉了&#xff0c;并不影响其他节点对外提供服务。也就是一台服务器出错了&#xff0c;仍然可以对外进行响应&#xff0c;不会因为某一台服务器出错而导致所有的请求都无法响应。综上所述&…

实验4 循环结构

1、判断素数 【问题描述】从键盘输入一个大于1的正整数&#xff0c;判断是否为素数 【输入形式】输入一个正整数 【输出形式】输出该数是否为素数 【样例输入】10 【样例输出】10 is not a prime number 【样例说明】样例2 输入&#xff1a;-10 输出&#xff1a;error! #de…

jmeter学习(7)beanshell

beanshell preprocessor 发送请求前执行 beanshell postprocessor 发送请求前执行 获取请求相关信息 String body sampler.getArguments().getArgument(0).getValue(); String url sampler.getPath(); 获取响应报文 String responseprev.getResponseDataAsString(); 获…

北京自闭症寄宿学校大盘点:优质教育资源汇总

北京自闭症寄宿学校大盘点&#xff1a;优质教育资源中的璀璨明珠——兼谈广州星贝育园 在北京&#xff0c;随着社会对自闭症儿童教育的日益重视&#xff0c;越来越多的优质寄宿学校应运而生&#xff0c;为这些特殊的孩子提供了专业的康复与教育环境。然而&#xff0c;当我们把…

【数据结构】【链表代码】随机链表的复制

/*** Definition for a Node.* struct Node {* int val;* struct Node *next;* struct Node *random;* };*/typedef struct Node Node; struct Node* copyRandomList(struct Node* head) {if(headNULL)return NULL;//1.拷贝结点&#xff0c;连接到原结点的后面Node…

猫头虎深度解读:过去2周,AI领域的十大突破事件与未来展望

猫头虎深度解读&#xff1a;过去2周&#xff0c;AI领域的十大突破事件与未来展望 &#x1f680;&#x1f916; 大家好&#xff0c;我是猫头虎技术团队的代表&#xff01;这两周&#xff0c;人工智能领域再次掀起了技术与应用的新浪潮。从立法到技术进展&#xff0c;再到前沿应…