20250213 隨筆 雪花算法
雪花算法(Snowflake Algorithm)
雪花算法(Snowflake) 是 Twitter 在 2010 年開發的一種 分布式唯一 ID 生成算法,它可以在 高併發場景下快速生成全局唯一的 64-bit 長整型 ID,且不依賴資料庫,具備 有序性、低延遲、高可用性 等特性。
1. 雪花算法 ID 結構
雪花算法生成的 ID 是一個 64-bit(8 字節)長整型數字,其組成結構如下:
0 | 41bit 时间戳 | 10bit 机器ID | 12bit 序列号
每一個 ID 的 64-bit 被劃分成以下幾個部分:
位數 | 名稱 | 說明 |
---|---|---|
1 bit | 符號位 | 固定為 0 ,因為 Snowflake ID 是正數 |
41 bits | 時間戳(毫秒級) | 表示當前 ID 生成的時間 |
10 bits | 機器 ID(Worker ID) | 用於區分不同的機器或節點 |
12 bits | 序列號(Sequence) | 用於同一毫秒內的流水號(防止並發衝突) |
2. 雪花算法 ID 生成邏輯
雪花算法的生成規則如下:
- 獲取當前時間戳(毫秒級),並去掉符號位,只保留 41-bit(大約可用 69 年)。
- 拼接機器 ID(Worker ID),確保在分布式環境中每台機器的 ID 唯一(10-bit,最多支持 1024 台機器)。
- 在同一毫秒內累加序列號(Sequence Number),如果超過 12-bit(最大 4096),則等待下一毫秒。
- 將上述部分組合成 64-bit 整數,並返回。
3. 為什麼使用雪花算法?
✅ 優勢
- 全球唯一性:ID 由時間戳 + 機器 ID + 序列號組成,確保唯一性。
- 趨勢有序性:由於前 41-bit 是時間戳,因此 ID 大致是遞增的(但不是嚴格連續)。
- 高效能:ID 生成完全本地化,不依賴數據庫,每台機器每毫秒可生成 4096 個 ID,並發性能高。
- 適合分布式系統:機器 ID 區分不同節點,不會因多節點並行生成導致衝突。
⚠️ 缺點
- 依賴系統時鐘
- 若 機器時鐘回撥(時間倒退),可能導致 ID 重複,需要額外處理(如阻塞、報錯、時鐘同步)。
- ID 不連續
- ID 是趨勢遞增的,但 由於多機器、多併發生成 ID,ID 可能不連續,不適合用來作為數據庫的主鍵索引(可搭配 分段索引)。
- 機器 ID 配置需要規劃
- 10-bit 只能支持 1024 台機器,如果機器超過 1024 需要進一步優化(如 機房 ID + 機器 ID)。
4. 雪花算法的 Java 實現
public class SnowflakeIdGenerator {private final static long START_TIMESTAMP = 1609459200000L; // 起始時間戳(2021-01-01)private final static long WORKER_ID_BITS = 10L; // 機器 ID 佔用 10-bitprivate final static long SEQUENCE_BITS = 12L; // 序列號佔用 12-bitprivate final static long MAX_WORKER_ID = (1L << WORKER_ID_BITS) - 1; // 1023private final static long MAX_SEQUENCE = (1L << SEQUENCE_BITS) - 1; // 4095private final static long WORKER_ID_SHIFT = SEQUENCE_BITS; // 機器 ID 左移位數private final static long TIMESTAMP_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS; // 時間戳左移位數private long workerId; // 當前機器 IDprivate long sequence = 0L; // 當前毫秒內的序列號private long lastTimestamp = -1L; // 記錄上一次的時間戳public SnowflakeIdGenerator(long workerId) {if (workerId > MAX_WORKER_ID || workerId < 0) {throw new IllegalArgumentException("Worker ID 超過範圍");}this.workerId = workerId;}public synchronized long nextId() {long timestamp = System.currentTimeMillis();// 時鐘回撥處理if (timestamp < lastTimestamp) {throw new RuntimeException("時鐘倒退,請求被拒絕");}if (timestamp == lastTimestamp) {sequence = (sequence + 1) & MAX_SEQUENCE;if (sequence == 0) {while (timestamp <= lastTimestamp) {timestamp = System.currentTimeMillis(); // 等待下一毫秒}}} else {sequence = 0;}lastTimestamp = timestamp;return ((timestamp - START_TIMESTAMP) << TIMESTAMP_SHIFT) | (workerId << WORKER_ID_SHIFT) | sequence;}
}
這段程式碼:
- 保證了多執行緒安全性(使用
synchronized
保證 ID 唯一)。 - 防止時鐘回撥導致的重複 ID 問題(如果發生時間回撥,則拋異常)。
- ID 趨勢遞增(由於高位是時間戳)。
5. 雪花算法的應用場景
場景 | 使用雪花算法的優勢 |
---|---|
分佈式數據庫主鍵 ID | 避免數據庫 ID 自增帶來的競爭 |
訂單號生成 | 高併發下快速生成唯一訂單號 |
日誌 ID、追蹤 ID | 方便分佈式系統中日誌的追蹤 |
消息隊列(Kafka、RocketMQ) | 保證消息的唯一性與排序 |
分佈式鎖的標識符 | 避免鎖 ID 重複 |
6. 變種與優化
1. 進一步縮短 ID 長度
如果 64-bit ID 太長,可以考慮:
- 減少時間戳位數(如用秒級而非毫秒級)。
- 減少機器 ID 或序列號位數。
2. 多機房支持
- 如果 機器 ID 不夠(超過 1024 台機器),可以:
- 拆分機器 ID → 5-bit 機房 ID + 5-bit 機器 ID(最多支持 32 個機房,每個機房 32 台機器)。
7. 總結
特性 | 描述 |
---|---|
高性能 | 毫秒級生成唯一 ID,不依賴 DB |
全球唯一性 | 基於時間 + 機器 ID + 序列號組成 |
趨勢遞增 | 保持 ID 有序性(但不連續) |
高併發 | 每台機器每毫秒可產生 4096 個 ID |
時鐘同步問題 | 需要額外處理時鐘回撥 |
雪花算法 是一種高效、低成本的全局唯一 ID 方案,適用於 高併發的分佈式系統,但使用時需要考慮機器 ID 分配、時鐘同步等問題。如果業務場景對 ID 長度較為敏感,則可以考慮基於雪花算法的變種方案來縮短 ID 位數。
相关文章:
20250213 隨筆 雪花算法
雪花算法(Snowflake Algorithm) 雪花算法(Snowflake) 是 Twitter 在 2010 年開發的一種 分布式唯一 ID 生成算法,它可以在 高併發場景下快速生成全局唯一的 64-bit 長整型 ID,且不依賴資料庫,具…...
Bug日记:Linux中systemctl restart network失败问题,网络故障
日期 2023年10月25日 问题描述 在尝试使用 systemctl restart network 重启网络服务时,出现以下错误: Job for network.service failed because the control process exited with error code. See "systemctl status network.service" and …...
计算四个锚点TOA定位中GDOP的详细步骤和MATLAB例程
该MATLAB代码演示了在三维空间中,使用四个锚点的TOA(到达时间)定位技术计算几何精度衰减因子(GDOP)的过程。如需帮助,或有导航、定位滤波相关的代码定制需求,请联系作者 文章目录 DOP计算原理MATLAB例程运行结果示例关键点说明扩展方向另有文章: 多锚点Wi-Fi定位和基站…...
poi 将图片写入到excel文件中
功能点说明 作用:将图片写入到指定的excel文件(或output流) 依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version> </dependen…...
新数据结构(9)——Java异常体系
异常的种类 程序本身通常无法主动捕获并处理错误(Error),因为这些错误通常表示系统级的严重问题,但程序可以捕获并处理异常(Excrption),而Error则被视为一种程序无法或不应尝试恢复的异常类型。…...
HTTP 响应头信息
HTTP 响应头信息 引言 HTTP(超文本传输协议)是互联网上应用最为广泛的网络协议之一。它定义了客户端与服务器之间交互的基本规则。在HTTP协议中,响应头信息扮演着至关重要的角色。本文将详细介绍HTTP响应头信息的概念、类型、作用及其在实际应用中的重要性。 响应头信息概…...
计算机视觉:卷积神经网络(CNN)基本概念(一)
第一章:计算机视觉中图像的基础认知 第二章:计算机视觉:卷积神经网络(CNN)基本概念(一) 第三章:计算机视觉:卷积神经网络(CNN)基本概念(二) 第四章:搭建一个经典的LeNet5神经网络 一、引言 卷积神经网络&…...
C#: String s = new String(“Hello“)无法编译?编程语言字符集有两个?为什么这种变量名“\u0061\u0062”都能编译通过?
C#: String s new String("Hello")无法编译? C# String类型是literal常量,默认不能用new创建,但可以在unsafe下用char *字符串指针创建。 char* charPtr stackalloc char[2]; charPtr[0] H; charPtr[1] \0; String myString new Strin…...
网络安全学习笔记之Internet基本知识
Internet构成 根据工作方式,可以把Internet分为边缘部分和核心部分。边缘部分由连接在Internet上的主机(用户的终端、服务器)组成。用户直接使用边缘部分进行通信和资源共享。核心部分由大量网络和连接这些网络的路由器组成。 服务类别 面向…...
【设计模式】【结构型模式】装饰者模式(Decorator)
👋hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD 🔥 2025本人正在沉淀中… 博客更新速度 👍 欢迎点赞、收藏、关注,跟上我的更新节奏 🎵 当你的天空突…...
3D可视化定制:开启个性化消费新时代
3D可视化定制是一种将产品的三维模型与可视化技术相结合,以满足消费者个性化需求的服务。以下是对3D可视化定制的详细介绍: 一、定义与原理 3D可视化定制是指利用三维建模技术和可视化工具,为消费者提供一个直观、互动且高度个性化的定制平…...
CRMEB 多商户版v3.0.1源码全开源+PC端+Uniapp前端+搭建教程
一.介绍 crmeb多商户是一套B2B2C商家入驻模式的平台多商户商城系统,系统支持平台自营、联营、招商等多种运营模式,可满足企业新零售、批发、分销、预售、O2O、多店、商铺入驻等各种业务需求。 后端全开源、uniapp多端可编译! 二、搭建教程…...
java八股文-mysql
1. 索引 1.1 什么是索引 索引(index)是帮助Mysql高效获取数据的数据结构(有序).提高数据的检索效率,降低数据库的IO成本(不需要全表扫描).通过索引列对数据进行排序,降低数据排序成本,降低了CPU的消耗. 1.2 mysql索引使用的B树? 1. 没有使用二叉树,最坏情况o&…...
Audio-Visual Speech Enhancement(视听语音增强)领域近三年研究进展与国内团队及手机厂商动态分析
一、视听语音增强领域近三年研究进展 多模态融合与模型轻量化 多模态特征融合:中国科学技术大学团队提出通过引入超声舌头图像和唇部视频的联合建模,结合知识蒸馏技术,在训练阶段利用教师模型传递舌部运动知识,从而在推断时仅依赖唇部视频即可提升语音增强效果。此外,中科…...
React AJAX:深入理解与高效实践
React AJAX:深入理解与高效实践 引言 随着互联网技术的不断发展,前端开发领域也经历了翻天覆地的变化。React 作为当前最流行的前端框架之一,其强大的组件化和虚拟DOM机制受到了广泛关注。而 AJAX(Asynchronous JavaScript and XML)作为实现前后端数据交互的重要技术,与…...
撕碎QT面具(1):Tab Widget转到某个Tab页
笔者未系统学过C语法,仅有Java基础,具体写法仿照于大模型以及其它博客。自我感觉,如果会一门对象语言,没必要先刻意学C,因为自己具有对象语言的基础,等需要用什么再学也不迟。毕竟不是专门学C去搞算法。 1…...
2025.2.16
Web [GDOUCTF 2023]泄露的伪装: 点进去看就是装神弄鬼,那就直接扫描 果然有东西 第一个是php代码 第二个是个文件 访问发现是一样的 分析一下:使用 file_get_contents($cxk) 函数读取 $cxk 变量中指定的 URL 或文件的内容。 如果读取的内…...
002 第一个python程序
编程语言 编程语言可以做的事情: 网站开发、软件 、游戏、APP、 小程序、 爬虫、 数据分析、脚本 第一个python程序 找到IDE图标pycharm 新建项目 选择项目路径 创建目录 新建python文件 输入代码 运行程序查看结果 print 介绍 print : 输出内容…...
面试完整回答:SQL 分页查询中 limit 500000,10和 limit 10 速度一样快吗?
首先:在 SQL 分页查询中,LIMIT 500000, 10 和 LIMIT 10 的速度不会一样快,以下是原因和优化建议: 性能差异的原因 LIMIT 10: 只需要扫描前 10 条记录,然后返回结果。 性能非常高,因为数据库只…...
《Foundation 起步》
《Foundation 起步》 引言 在当今快速发展的科技时代,了解并掌握最新的技术是至关重要的。本文旨在为初学者提供一个全面的《Foundation》起步指南,帮助大家快速入门并掌握这一强大的技术。 一、什么是Foundation? Foundation 是一个流行的前端框架,由 ZURB 公司开发。…...
【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第十五节】
ISO 14229-1:2023 UDS诊断服务测试用例全解析(RoutineControl_0x31服务) 作者:车端域控测试工程师 更新日期:2025年02月14日 关键词:UDS协议、0x31服务、例程控制、ISO 14229-1:2023、ECU测试 一、服务功能概述 0x31服…...
数据结构:顺序表
目录 一、数据结构的概念 什么是数据结构? 为什么还需要数据结构? 二、顺序表 1.线性表 2.顺序表和数组的区别 3.顺序表分类 3.1静态顺序表 3.2动态顺序表 三、动态顺序表的实现 一、数据结构的概念 什么是数据结构? 数据结构可以…...
LC-随机链表的复制、排序链表、合并K个升序链表、LRU缓存
随机链表的复制 为了在 O(n) 时间复杂度内解决这个问题,并且使用 O(1) 的额外空间,可以利用以下技巧: 将新节点插入到原节点后面:我们可以将复制节点插入到原节点后面。例如,如果链表是 A -> B -> C,…...
对于简单的HTML、CSS、JavaScript前端,我们可以通过几种方式连接后端
1. 使用Fetch API发送HTTP请求(最简单的方式): //home.html // 示例:提交表单数据到后端 const submitForm async (formData) > {try {const response await fetch(http://your-backend-url/api/submit, {method: POST,head…...
打印问题总结
问题一: 记一次发票打印模糊问题,后端返回的是pdf 之前实现的效果是将后端返回的pdf转成canvas再转成图片 预览 问题: 打印效果很模糊 解决方式: 就是直接预览pdf 借助pdf的打印和下载即可 问题二: 激光打印一般…...
2025蓝桥杯JAVA编程题练习Day4
1.艺术与篮球 问题描述 小蓝出生在一个艺术与运动并重的家庭中。 妈妈是位书法家,她希望小蓝能通过练习书法,继承她的艺术天赋,并练就一手好字。爸爸是一名篮球教练,他希望小蓝能通过篮球锻炼身体,培养运动的激情和…...
github用户名密码登陆失效了
问题: git push突然推代码需要登陆,但是用户名和密码正确输入后,却提示403 git push# Username for https://github.com: **** #Password for https://gyp-programmergithub.com: #remote: Permission to gyp-programmer/my-app.git denie…...
数据结构 day02
3. 线性表 3.1. 顺序表 3.1.3. 顺序表编程实现 操作:增删改查 .h 文件 #ifndef __SEQLIST_H__ #define __SEQLIST_H__ #define N 10 typedef struct seqlist {int data[N];int last; //代表数组中最后一个有效元素的下标 } seqlist_t;//1.创建一个空的顺序表 seq…...
前端里的this指向问题
目录 1.代码输出结果 2.代码输出结果 3.代码输出结果 4.代码输出结果 5.代码输出结果 6.代码输出结果 7.代码输出结果 8.代码输出结果 9.代码输出结果 10.代码输出结果 11.代码输出结果 12.代码输出结果 13.代码输出结果 14.代码输出结果 总结 1.代码输出结果 f…...
pandas(11 分类数据和数据可视化)
前面内容:pandas(10 日期和Timedelta) 目录 一、Python Pandas 分类数据 1.1 pd.Categorical() 1.2 describe() 1.3 获取类别的属性 1.4 分类操作 1.5 分类数据的比较 二、Python Pandas 数据可视化 2.1 基础绘图:plot 2.2 条形图 2.3 直方…...
cmake Qt Mingw windows构建
今天教大家怎么在windows构建qt应用使用cmd命令行,而不是一键通过QtCreator一键构建。首先我们用qtcreator创建一个模板程序(PS:记得在安装qt时要悬着mingw套件,如果安装太慢可以换源) 输入以下的命令: mkdir build …...
缓存穿透、缓存击穿、缓存雪崩的区别与解决方案
1. 缓存穿透(Cache Penetration) 定义:大量请求查询 数据库中不存在的数据,导致请求绕过缓存直接访问数据库,造成数据库压力过大。 场景: 恶意攻击:例如用不存在的用户ID频繁请求。 业务误操作…...
【Rust中级教程】1.6. 内存 Pt.4:静态(static)内存与‘static生命周期标注
喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 1.6.1. 静态(static)内存 static内存实际上是一个统称,它指的是程序编译后的文…...
Python爬虫实战:股票分时数据抓取与存储 (1)
在金融数据分析中,股票分时数据是投资者和分析师的重要资源。它能够帮助我们了解股票在交易日内的价格波动情况,从而为交易决策提供依据。然而,获取这些数据往往需要借助专业的金融数据平台,其成本较高。幸运的是,通过…...
HTML之JavaScript对象
HTML之JavaScript对象 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><s…...
【第12章:深度学习与伦理、隐私—12.3 深度学习模型的透明性与可解释性提升策略】
凌晨三点的ICU病房,AI辅助诊断系统将一位患者的肺炎误判为普通感冒——当主治医生要求查看诊断依据时,系统只能给出冷冰冰的概率数值。这场惊心动魄的误诊事件,掀开了深度学习可解释性危机的冰山一角。 一、模型透明的"第一性原理" 1.1 可解释性的三维度量 ![可…...
SOCKET建立简单的tcp服务端与客户端通信
socket是什么 socket可以使两台机子建立连接,就像连接风扇与电源的插座一样,socket可以使服务端与客户端建立连接,服务端就像供电厂,而客户端就像用电器,而socket就是连接二者的插座。 建立简单的连接 如果我们想在客…...
最新智能优化算法: 阿尔法进化(Alpha Evolution,AE)算法求解23个经典函数测试集,MATLAB代码
一、阿尔法进化算法 阿尔法进化(Alpha Evolution,AE)算法是2024年提出的一种新型进化算法,其核心在于通过自适应基向量和随机步长的设计来更新解,从而提高算法的性能。以下是AE算法的主要步骤和特点: 主…...
HTML之JavaScript常见事件
HTML之JavaScript常见事件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title>&…...
《云原生安全攻防》-- K8s镜像安全:镜像全生命周期安全管理
从攻击者的角度来看,针对容器镜像的软件供应链攻击和镜像投毒等攻击方式,不仅攻击成本低,而且还能带来更高且持久的收益。因此,镜像安全问题变得日益突出。 在本节课程中,我们将深入探讨镜像全生命周期的安全管理&…...
【Copilot】Redis SCAN SSCAN
目录 SCAN 命令SSCAN 命令使用示例原理Redis SCAN 和 SSCAN 命令的注意事项及风险注意事项风险 以下内容均由Github Copilot生成。 SCAN 和 SSCAN 命令是 Redis 提供的用于增量迭代遍历键或集合元素的命令。它们的主要优点是可以避免一次性返回大量数据,从而减少对 …...
【含开题报告+文档+PPT+源码】基于Spring+Vue的拾光印记婚纱影楼管理系统
开题报告 本论文旨在探讨基于Spring和Vue框架的拾光印记婚纱影楼管理系统的设计与实现。该系统集成了用户注册登录、个人资料修改、婚庆资讯浏览、婚庆套餐查看、婚纱拍摄预约、婚纱浏览与租赁、客片查看以及在线客服等多项功能,为用户提供了一站式的婚纱影楼服务体…...
静态页面在安卓端可以正常显示,但是在ios打开这个页面就需要刷新才能显示全图片
这个问题可能有几个原因导致,我来分析一下并给出解决方案: 首要问题是懒加载实现方式的兼容性问题。当前的懒加载实现可能在 iOS 上不够稳定。建议修改图片懒加载的实现方式: // 使用 Intersection Observer API 实现懒加载 function initLazyLoading() {const imageObserver…...
【Qt】QObject类的主要功能
在 Qt 中,QObject 类是所有 Qt 对象的基类,提供了许多基础功能,使得 Qt 的对象系统能够有效地工作。它为其他类提供了核心的机制,比如信号和槽机制、对象树结构、内存管理等。 QObject 类的主要功能: 信号和槽机制&am…...
第 16 天:游戏 UI(UMG)开发,打造主菜单 血条!
🎯 目标 ✅ 使用 UMG 创建 UI 并在游戏中显示 ✅ 实现血条(HP Bar)系统,动态显示角色生命值 ✅ 创建主菜单 UI,并添加开始/退出按钮 ✅ 保存当前场景,创建新场景作为主菜单 ✅ 点击 StartGameButton 后&am…...
兔兔答题应用于微信考试、付费考试、社会调查问卷、明星知识问答、员工培训考核、模拟自测、企业面试、试题库等多种场景。
“兔兔答题系统”是一个面向教育、培训和在线测评场景的智能化答题平台(兔兔答题官网地址)。其设计目标是帮助用户高效完成题目练习、考试组织及学习效果分析,通常具备以下核心功能和特色: 一、核心功能 题库管理 支持多题型录入&…...
【办公类-90-02】】20250215大班周计划四类活动的写法(分散运动、户外游戏、个别化综合)(基础列表采用读取WORD表格单元格数据,非采用切片组合)
背景需求: 做了中班的四类活动安排表,我顺便给大班做一套 【办公类-90-01】】20250213中班周计划四类活动的写法(分散运动、户外游戏、个别化(美工室图书吧探索室))-CSDN博客文章浏览阅读874次࿰…...
19.4.6 读写数据库中的二进制数据
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 需要北风数据库的请留言自己的信箱。 北风数据库中,类别表的图片字段在【数据表视图】中显示为Bitmap Image࿱…...
使用 Python 爬虫获取微店快递费用 item_fee API 接口数据
在电商运营中,快递费用是影响商家利润和用户体验的重要因素之一。微店作为国内知名的电商平台,提供了丰富的 API 接口供开发者使用,其中也包括查询商品快递费用的接口。通过调用微店的 item_fee 接口,开发者可以获取指定商品的快递…...
蓝桥杯篇---温度传感器 DS18B20
文章目录 前言DS18B201. DS18B20 引脚说明2. 单总线通信协议3. DS18B20 操作流程初始化写操作读操作 4. 示例代码5. 代码说明6. 注意事项总结 前言 本文简单介绍了IAP15F2K61S2中温度传感器模块DS18B20的使用。 DS18B20 DS18B20 是一款数字温度传感器,采用单总线&…...