当前位置: 首页 > article >正文

深入理解分布式唯一ID:从原理到实战,一篇讲透Snowflake

深入理解分布式唯一ID从原理到实战一篇讲透Snowflake一、为什么我们需要“唯一ID”先从一个最简单的场景说起你有一个订单系统每天产生几百万条订单记录。如果只用数据库的自增主键当系统拆分成多个数据库时ID就会冲突——因为你不能保证两个库的自增序列是独立的。这就是分布式ID要解决的核心问题在分布式环境下生成全局唯一、且尽可能有序的标识符。二、Snowflake的核心原理重点cn.hutool.core.lang.Snowflake生成的唯一性主键是基于Twitter 雪花算法Snowflake的一种 Java 实现。其核心原理是将一个 64 位的 long 型整数划分为多个部分通过组合时间戳、机器标识和序列号来生成一个全局唯一的 ID。雪花算法的 64 位结构Hutool 的Snowflake生成的 ID 是一个 64 位的 long 型数字其二进制位具体分配如下位数长度作用说明第 1 位1 bit符号位固定为 0表示生成的 ID 为正数。接下来 41 位41 bits时间戳记录当前时间与一个自定义起始时间epoch的差值毫秒级。这 41 位可以支撑算法使用69 年。接下来 10 位10 bits机器标识用于区分不同的节点。Hutool 将其拆分为 5 位的数据中心 ID (datacenterId)和 5 位的工作机器 ID (workerId)最多支持部署32 * 32 1024个节点。最后 12 位12 bits序列号在同一毫秒内为同一机器生成的 ID 分配不同的序号。12 位可以生成4096个不同的序列号。ID 生成流程与核心机制Snowflake的工作流程通过其nextId()方法实现该方法使用synchronized关键字保证线程安全。获取当前时间戳获取当前系统的毫秒级时间戳。处理时间回拨如果检测到当前时间小于上一次生成 ID 的时间说明发生了“时钟回拨”。Hutool 的处理策略是容忍 2 秒内的微小回拨通过等待时间来规避若回拨过大超过 2 秒则会直接抛出异常防止 ID 重复。生成序列号如果当前时间戳与上一次相同处于同一毫秒内则让序列号自增sequence 1。如果自增后序列号超过 4096则会等待直到下一毫秒并将序列号重置为 0。如果当前时间戳与上一次不同进入新的一毫秒则直接将序列号重置为 0。拼接最终 ID将计算好的时间戳差值、数据中心 ID、工作机器 ID 和序列号通过左移和按位或|操作拼接成一个 64 位的 long 型整数并返回。唯一性保证该算法能够保证分布式环境下的唯一性主要依赖于以下三点时间戳唯一性确保不同时间生成的 ID 必然不同。机器标识唯一性通过为每个服务节点分配唯一的workerId和datacenterId确保了不同节点生成的 ID 不会冲突。序列号唯一性在同一毫秒内通过自增序列号确保单节点上生成的 ID 不重复。使用示例在 Hutool 中使用IdUtil.getSnowflake(...)可以非常方便地创建Snowflake对象importcn.hutool.core.lang.Snowflake;importcn.hutool.core.util.IdUtil;// 为当前节点分配数据中心ID (0-31) 和 机器ID (0-31)SnowflakesnowflakeIdUtil.getSnowflake(1,1);// 生成一个唯一的 long 类型 IDlongidsnowflake.nextId();System.out.println(id);// 例如1553932736402362368// 生成一个 String 类型的 IDStringidStrsnowflake.nextIdStr();System.out.println(idStr);三、你可能想问的几个问题问题1第一位为什么必须是0因为Java的long是有符号整数第一位是符号位0 正数1 负数谁也不想自己的订单号是个负数吧所以第一位固定为0保证ID永远是正数。问题2我从来没设置过起始时间它从哪来的Hutool给你内置了一个默认值2016-05-20 00:00:00北京时间。算法存储的不是绝对时间而是差值时间戳部分 当前时间 - 起始时间这样做的原因是如果直接存绝对时间戳比如2026-04-10的毫秒数约为17万亿41位根本存不下。存差值的话2^41毫秒 ≈ 69年够用了。问题369年后会发生什么会不会重复这是一个很好的问题。答案是不会重复但会抛异常。因为41位时间戳有上限2^41 - 1 2199023255551毫秒 ≈ 69.7年。当时间差值超过这个上限时算法装不下了会直接抛出异常拒绝生成ID。if(timestampDiffMAX_TIME){thrownewRuntimeException(Clock is beyond the maximum timestamp limit);}至于69年后怎么办说实话能跑69年的系统凤毛麟角。届时要么升级算法要么你早就换工作了四、其他方案的简要对比Snowflake虽然好用但也不是唯一的选择。这里简单列出几种常见方案方案优点缺点适合场景数据库自增简单、有序并发瓶颈、分布式下冲突小项目、单机应用UUID本地生成、全局唯一无序、占空间大客户端生成ID的场景Redis自增性能高引入额外组件已使用Redis的系统Snowflake性能极高、趋势递增依赖时钟、需要分配机器ID互联网高并发系统五、总结回到最初的问题Snowflake是怎么保证唯一性的答案其实很清晰不同时间生成的ID靠时间戳区分同一时间不同机器生成的ID靠机器ID区分同一时间同一机器生成的ID靠序列号区分三个维度叠加理论上每毫秒每台机器可以生成4096个不重复的ID。如果你正在做分布式系统的技术选型Snowflake是一个成熟可靠的选择。Hutool的实现封装得很好几行代码就能用起来性价比非常高。希望这篇文章能帮你彻底理解分布式ID的生成原理。如果你有更多问题欢迎在评论区交流。

相关文章:

深入理解分布式唯一ID:从原理到实战,一篇讲透Snowflake

深入理解分布式唯一ID:从原理到实战,一篇讲透Snowflake 一、为什么我们需要“唯一ID”? 先从一个最简单的场景说起:你有一个订单系统,每天产生几百万条订单记录。如果只用数据库的自增主键,当系统拆分成多个…...

Steam成就管理神器:3分钟掌握SAM的完全使用指南

Steam成就管理神器:3分钟掌握SAM的完全使用指南 【免费下载链接】SteamAchievementManager A manager for game achievements in Steam. 项目地址: https://gitcode.com/gh_mirrors/st/SteamAchievementManager Steam Achievement Manager(简称SA…...

终极指南:用TegraRcmGUI轻松解锁Nintendo Switch的无限潜力

终极指南:用TegraRcmGUI轻松解锁Nintendo Switch的无限潜力 【免费下载链接】TegraRcmGUI C GUI for TegraRcmSmash (Fuse Gele exploit for Nintendo Switch) 项目地址: https://gitcode.com/gh_mirrors/te/TegraRcmGUI 还在为Nintendo Switch的封闭系统感到…...

3步搞定专业歌词制作:LRC Maker终极指南

3步搞定专业歌词制作:LRC Maker终极指南 【免费下载链接】lrc-maker 歌词滚动姬|可能是你所能见到的最好用的歌词制作工具 项目地址: https://gitcode.com/gh_mirrors/lr/lrc-maker 还在为制作歌词时间轴而烦恼吗?想要让歌词与音乐完美…...

告别手动同步!用Karmada实现跨集群应用一键分发(附PropagationPolicy配置详解)

告别手动同步!用Karmada实现跨集群应用一键分发(附PropagationPolicy配置详解) 在云原生技术快速发展的今天,企业往往需要管理分布在多个地域、不同环境的Kubernetes集群。传统的手工同步方式不仅效率低下,还容易出错。…...

ollama部署Phi-4-mini-reasoning代码实例:Python调用+API封装教程

ollama部署Phi-4-mini-reasoning代码实例:Python调用API封装教程 你是不是也遇到过这样的问题:想快速体验一个轻量但推理能力强的模型,又不想折腾复杂的环境配置?或者手头有个小项目需要嵌入数学推理能力,但大模型太重…...

MATLAB数值计算与百川2-13B模型在科学数据分析中的协同

MATLAB数值计算与百川2-13B模型在科学数据分析中的协同 做科研或者工程计算的朋友,对MATLAB肯定不陌生。它就像我们手里的“瑞士军刀”,矩阵运算、信号处理、仿真建模,样样在行。但不知道你有没有过这样的感觉:数据算完了&#x…...

AIGC 动态图表生成:从零到一实战指南

1. 为什么需要AIGC动态图表生成? 在日常工作中,我们经常需要将枯燥的数据转化为直观的图表。传统方式需要手动编写HTML、JS和ECharts代码,不仅耗时耗力,还容易出错。我曾经为了调整一个饼图的标签位置,花了整整一上午…...

【K8s】【笔记】----- 第一章 :Kubernetes 介绍

【K8s】【笔记】----第一章:Kubernetes 介绍 【K8s】【笔记】----第二章:Kubernetes 集群环境搭建 【K8s】【笔记】----第三章:Kubernetes 资源管理 【K8s】【笔记】----第四章:Kubernetes 实战入门 【K8s】【笔记】----第五章&am…...

Redis怎样降低布隆过滤器的误判率

布隆过滤器误判率由初始capacity决定,超载会导致误判率飙升;应按峰值数据1.3~1.5设capacity,BF.INFO中items/capacity>0.8需重建;扩容优先增capacity而非k,批量插入必用BF.MADD。误判率超预期&a…...

WorkshopDL终极指南:如何免费下载1000+款Steam创意工坊模组

WorkshopDL终极指南:如何免费下载1000款Steam创意工坊模组 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 还在为GOG或Epic平台游戏无法使用Steam创意工坊模组而烦恼…...

GetQzonehistory:你的QQ空间数字记忆终极备份方案

GetQzonehistory:你的QQ空间数字记忆终极备份方案 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 在数字时代,我们的记忆分散在各个社交平台,QQ空间作…...

mysql如何对比备份数据与线上数据_编写自动化校验脚本

用mysqldump生成可比对备份需加--skip-extended-insert、--order-by-primary、--skip-comments、--no-tablespaces四参数;线上数据须用mysql -N -s -r直连导出TSV,再转为同格式INSERT后diff比对。用 mysqldump 生成可比对的备份快照直接拿原始 mysqldump…...

Kook Zimage真实幻想Turbo快速部署教程:24G显存跑满1024×1024高清输出

Kook Zimage真实幻想Turbo快速部署教程:24G显存跑满10241024高清输出 想用个人电脑的显卡,快速生成那种充满梦幻感、光影细腻的幻想风格人像吗?今天要介绍的这个项目,或许能让你眼前一亮。 Kook Zimage真实幻想Turbo&#xff0c…...

OpenClaw本地部署指南|nanobot镜像预置GPU监控Dashboard(Grafana+Prometheus模板)

OpenClaw本地部署指南|nanobot镜像预置GPU监控Dashboard(GrafanaPrometheus模板) 1. 项目简介 nanobot是一款受OpenClaw启发的超轻量级个人人工智能助手,仅需约4000行代码就能提供核心代理功能,比传统方案的代码量减…...

Matplotlib数据可视化实战:从基础图表到高级定制

1. Matplotlib入门:为什么选择这个可视化工具? 第一次接触数据可视化时,我被各种工具搞得眼花缭乱。Excel、Tableau、Power BI...直到遇见Matplotlib,才发现这个Python库才是数据分析师的"瑞士军刀"。它最大的优势就是…...

嵌入式AI边缘部署雏形:STM32与PyTorch服务器协同的物体识别系统设计

嵌入式AI边缘部署雏形:STM32与PyTorch服务器协同的物体识别系统设计 1. 引言:当单片机遇上AI服务器 想象一下这样的场景:一个巴掌大的STM32开发板通过摄像头捕捉图像,瞬间将画面传送到云端服务器进行AI分析,再根据识…...

tao-8k嵌入模型实战:如何用WebUI轻松实现文本语义相似度计算

tao-8k嵌入模型实战:如何用WebUI轻松实现文本语义相似度计算 1. 引言:从文本到向量的魔法 你有没有想过,计算机是如何“理解”两句话意思差不多的?比如,“今天天气真好”和“阳光明媚的一天”,我们人类一…...

5个必学技巧:用EldenRingFPSUnlockAndMore彻底解锁《艾尔登法环》体验

5个必学技巧:用EldenRingFPSUnlockAndMore彻底解锁《艾尔登法环》体验 【免费下载链接】EldenRingFpsUnlockAndMore A small utility to remove frame rate limit, change FOV, add widescreen support and more for Elden Ring 项目地址: https://gitcode.com/gh…...

从编译错误到成功仿真:记录我调试MIT Mini Cheetah源码时遇到的3个典型问题

从编译错误到成功仿真:记录我调试MIT Mini Cheetah源码时遇到的3个典型问题 调试MIT Mini Cheetah开源代码的过程,就像是在解一道复杂的数学题——每一步都可能隐藏着意想不到的陷阱。作为一个曾经在这个项目上耗费了整整两个周末的开发者,我…...

如何在一台电脑上实现多人分屏游戏:Nucleus Co-Op终极指南

如何在一台电脑上实现多人分屏游戏:Nucleus Co-Op终极指南 【免费下载链接】nucleuscoop Starts multiple instances of a game for split-screen multiplayer gaming! 项目地址: https://gitcode.com/gh_mirrors/nu/nucleuscoop 你是否曾梦想与朋友在同一台…...

verilog中的、、有什么区别和联系?

在 Verilog 中,&、&& 和 &&& 都是逻辑运算符,但它们在操作的对象和行为上有显著的不同。 1. & (按位与运算符,bitwise AND) 用途:& 是按位与运算符,用于对两个操作数的每一位执行 AND 运算。 操作对象:它对每个操作数的 每一位 执行逻…...

TPFanCtrl2:ThinkPad风扇控制的完整解决方案与配置指南

TPFanCtrl2:ThinkPad风扇控制的完整解决方案与配置指南 【免费下载链接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 项目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 TPFanCtrl2是专为ThinkPad笔记本电脑设计的开源风扇…...

痞子衡嵌入式:turbo-spiboot - 一种基于MCUBoot协议的二级SPI加载APP提速方案必

前面我们对 Kafka 的整体架构和一些关键的概念有了一个基本的认知,本文主要介绍 Kafka 的一些配置参数。掌握这些参数的作用对我们的运维和调优工作还是非常有帮助的。 写在前面 Kafka 作为一个成熟的事件流平台,有非常多的配置参数。详细的参数列表可以…...

当压铸与挤出走向高端制造,真正的竞争不在设备,而在温控系统——模温机与超高温电加热导热油系统,正在成为设备配套的隐形核心

(星德温控技术研究中心-月生) 在过去相当长一段时间里,无论是橡塑挤出设备行业,还是压铸设备行业,行业的主流认知始终围绕“主机能力”展开——挤出领域拼螺杆结构、模头设计与自动化水平,压铸领域拼锁模力…...

高级算法面试五十题深度解析,算法工程师面试必备

高级算法工程师面试50题深度解析与举一反三 难度警告:本系列题目专为冲击顶级技术岗位(如L5及以上算法工程师、研究员)的候选人设计。题目深度结合前沿论文、复杂系统设计与高难度竞赛题,要求候选人不仅精通经典算法,更…...

STM32F407驱动4位数码管:从硬件连接到动态扫描编程实战

1. 硬件连接:从零搭建STM32F407与数码管的桥梁 第一次接触数码管驱动时,最让我头疼的就是硬件连线。记得当时拿着杜邦线在开发板和数码管模块之间来回比划,生怕接错线烧坏设备。其实只要理解几个关键点,连接过程会变得非常简单。…...

YOLOv8头部改进全攻略:从SEAM到MultiSEAM的代码实现与效果对比

YOLOv8头部改进全攻略:从SEAM到MultiSEAM的代码实现与效果对比 在目标检测领域,YOLO系列模型因其卓越的实时性能而广受欢迎。YOLOv8作为最新一代的代表,其头部结构的设计直接影响着检测精度与速度。本文将深入探讨两种创新性头部改进方案——…...

如何在不安装Steam的情况下获取创意工坊模组

如何在不安装Steam的情况下获取创意工坊模组 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 对于许多游戏爱好者来说,Steam创意工坊是一个宝库,里面充满…...

C语言文件操作实战:读写YOLOv12模型权重与配置

C语言文件操作实战:读写YOLOv12模型权重与配置 如果你正在用C或C捣鼓YOLOv12模型,尤其是在那些没有现成Python库的嵌入式或高性能计算环境里,那么你很可能需要自己动手,从最底层的文件读写开始,把模型权重和配置“喂”…...