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

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 生成邏輯

雪花算法的生成規則如下:

  1. 獲取當前時間戳(毫秒級),並去掉符號位,只保留 41-bit(大約可用 69 年)。
  2. 拼接機器 ID(Worker ID),確保在分布式環境中每台機器的 ID 唯一(10-bit,最多支持 1024 台機器)。
  3. 在同一毫秒內累加序列號(Sequence Number),如果超過 12-bit(最大 4096),則等待下一毫秒。
  4. 將上述部分組合成 64-bit 整數,並返回。

3. 為什麼使用雪花算法?

✅ 優勢

  1. 全球唯一性:ID 由時間戳 + 機器 ID + 序列號組成,確保唯一性。
  2. 趨勢有序性:由於前 41-bit 是時間戳,因此 ID 大致是遞增的(但不是嚴格連續)。
  3. 高效能:ID 生成完全本地化,不依賴數據庫,每台機器每毫秒可生成 4096 個 ID,並發性能高。
  4. 適合分布式系統:機器 ID 區分不同節點,不會因多節點並行生成導致衝突。

⚠️ 缺點

  1. 依賴系統時鐘
    • 機器時鐘回撥(時間倒退),可能導致 ID 重複,需要額外處理(如阻塞、報錯、時鐘同步)。
  2. ID 不連續
    • ID 是趨勢遞增的,但 由於多機器、多併發生成 ID,ID 可能不連續,不適合用來作為數據庫的主鍵索引(可搭配 分段索引)。
  3. 機器 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 隨筆 雪花算法

雪花算法&#xff08;Snowflake Algorithm&#xff09; 雪花算法&#xff08;Snowflake&#xff09; 是 Twitter 在 2010 年開發的一種 分布式唯一 ID 生成算法&#xff0c;它可以在 高併發場景下快速生成全局唯一的 64-bit 長整型 ID&#xff0c;且不依賴資料庫&#xff0c;具…...

(前端基础)HTML(一)

前提 W3C:World Wide Web Consortium&#xff08;万维网联盟&#xff09; Web技术领域最权威和具有影响力的国际中立性技术标准机构 其中标准包括&#xff1a;机构化标准语言&#xff08;HTML、XML&#xff09; 表现标准语言&#xff08;CSS&#xff09; 行为标准&#xf…...

pdf.js默认显示侧边栏和默认手形工具

文章目录 默认显示侧边栏(切换侧栏)默认手形工具(手型工具) 大部分的都是在viewer.mjs中的const defaultOptions 变量设置默认值,可以使用数字也可以使用他们对应的变量枚举值 默认显示侧边栏(切换侧栏) 在viewer.mjs中找到defaultOptions,大概在732行,或则搜索sidebarViewOn…...

学习总结三十三

括号序列 如果它是一个右括号&#xff0c;考察它与它左侧离它最近的未匹配的的左括号。如果该括号与之对应&#xff08;即小括号匹配小括号&#xff0c;中括号匹配中括号&#xff09;&#xff0c;则将二者配对。简单理解&#xff0c;找到一个右括号&#xff0c;向左找一个左括号…...

微信小程序 - 组件

组件通信事件 父传子 父组件如果需要向子组件传递指定属性的数据&#xff0c;在 WXML 中需要使用数据绑定的方式 与普通的 WXML 模板类似&#xff0c;使用数据绑定&#xff0c;这样就可以向子组件的属性传递动态数据。 父组件如果需要向子组件传递数据&#xff0c;只需要两…...

如何在Ubuntu中切换多个PHP版本

在Ubuntu环境下实现PHP版本的灵活切换&#xff0c;是众多开发者与系统管理员的重要技能之一。下面&#xff0c;我们将深入探讨如何在Ubuntu系统中安装、配置及管理多个PHP版本&#xff0c;确保您的开发环境随心所欲地适应各类项目需求。 开始前的准备 确保您的Ubuntu系统保持…...

解决DeepSeek服务器繁忙问题

目录 解决DeepSeek服务器繁忙问题 一、用户端即时优化方案 二、高级技术方案 三、替代方案与平替工具&#xff08;最推荐简单好用&#xff09; 四、系统层建议与官方动态 用加速器本地部署DeepSeek 使用加速器本地部署DeepSeek的完整指南 一、核心原理与工具选择 二、…...

Huatuo热更新--安装HybridCLR

1.自行安装unity编辑器 支持2019.4.x、2020.3.x、2021.3.x、2022.3.x 中任一版本。推荐安装2019.4.40、2020.3.26、2021.3.x、2022.3.x版本。 根据你打包的目标平台&#xff0c;安装过程中选择必要模块。如果打包Android或iOS&#xff0c;直接选择相应模块即可。如果你想打包…...

flink cdc2.2.1同步postgresql表

目录 简要说明前置条件maven依赖样例代码 简要说明 在flink1.14.4 和 flink cdc2.2.1下&#xff0c;采用flink sql方式&#xff0c;postgresql同步表数据&#xff0c;本文采用的是上传jar包&#xff0c;利用flink REST api的方式进行sql执行。 前置条件 1.开启logical 确保你…...

Golang协程调度模型MPG

深入解析Golang协程调度模型MPG&#xff1a;原理、实践与性能优化 一、为什么需要MPG模型&#xff1f; 在传统操作系统调度中&#xff0c;线程作为CPU调度的基本单位存在两个根本性挑战&#xff1a;1&#xff09;内核线程上下文切换成本高昂&#xff08;约1-5μs&#xff09;…...

纪念日倒数日项目的实现-【纪念时刻-时光集】

纪念日/倒数日项目的实现## 一个练手的小项目&#xff0c;uniappnodemysql七牛云。 在如今快节奏的生活里&#xff0c;大家都忙忙碌碌&#xff0c;那些具有特殊意义的日子一不小心就容易被遗忘。今天&#xff0c;想给各位分享一个“纪念日”项目。 【纪念时刻-时光集】 一…...

WPF的MVVMLight框架

在NuGet中引入该库&#xff1a; MVVMLight框架中的命令模式的使用&#xff1a; <StackPanel><TextBox Text"{Binding Name}"/><TextBox Text"{Binding Title}"/><Button Content"点我" Command"{Binding ShowCommand…...

DeepSeek从入门到精通(清华大学)

​ DeepSeek是一款融合自然语言处理与深度学习技术的全能型AI助手&#xff0c;具备知识问答、数据分析、编程辅助、创意生成等多项核心能力。作为多模态智能系统&#xff0c;它不仅支持文本交互&#xff0c;还可处理文件、图像、代码等多种格式输入&#xff0c;其知识库更新至2…...

【DeepSeek】DeepSeek R1 本地windows部署(Ollama+Docker+OpenWebUI)

1、背景&#xff1a; 2025年1月&#xff0c;DeepSeek 正式发布 DeepSeek-R1 推理大模型。DeepSeek-R1 因其成本价格低廉&#xff0c;性能卓越&#xff0c;在 AI 行业引起了广泛关注。DeepSeek 提供了多种使用方式&#xff0c;满足不同用户的需求和场景。本地部署在数据安全、性…...

windows平台上 oracle简单操作手册

一 环境描述 Oracle 11g单机环境 二 基本操作 2.1 数据库的启动与停止 启动: C:\Users\Administrator>sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on 星期五 7月 31 12:19:51 2020 Copyright (c) 1982, 2013, Oracle. All rights reserved. 连接到:…...

【弹性计算】弹性计算的技术架构

弹性计算的技术架构 1.工作原理2.总体架构3.控制面4.数据面5.物理设施层 虽然弹性计算的产品种类越来越多&#xff0c;但不同产品的技术架构大同小异。下面以当前最主流的产品形态 —— 云服务器为例&#xff0c;探查其背后的技术秘密。 1.工作原理 云服务器通常以虚拟机的方…...

RAG(检索增强生成)落地:基于阿里云opensearch视线智能问答机器人与企业知识库

文章目录 一、环境准备二、阿里云opensearch准备1、产品文档2、准备我们的数据3、上传文件 三、对接1、对接文本问答 一、环境准备 # 准备python环境 conda create -n opensearch conda activate opensearch# 安装必要的包 pip install alibabacloud_tea_util pip install ali…...

【踩坑】pytorch模型导出部署onnx问题记录

问题1&#xff1a;repeat_interleave 无法转译 具体报错为&#xff1a; TypeError: torch._C.Value object is not iterable (Occurred when translating repeat_interleave).原因是我的模型代码中有&#xff1a; batch_indices torch.repeat_interleave(torch.arange(can…...

利用prompt技术结合大模型对目标B/S架构软件系统进行测试

利用prompt技术结合大模型对目标B/S架构软件系统进行测试,可参考以下步骤和方法: 测试需求理解与prompt设计 明确测试点:梳理B/S架构软件系统的功能需求、非功能需求(如性能、安全性、兼容性等),确定具体的测试点,如用户登录功能、数据查询功能、系统响应时间要求等。设…...

DeepSeek vs ChatGPT:AI对决中的赢家是……人类吗?

DeepSeek vs ChatGPT&#xff1a;AI对决中的赢家是……人类吗&#xff1f; 文章目录 DeepSeek vs ChatGPT&#xff1a;AI对决中的赢家是……人类吗&#xff1f;一、引言1. 背景2. 问题 二、DeepSeek vs ChatGPT&#xff1a;谁更胜一筹&#xff1f;2.1 语言生成能力评测对比场景…...

基于ollama搭建本地deepseek大模型服务

基于ollama搭建本地deepseek大模型服务 简介准备工作系统要求ollama的安装ollama 模型ollama 安装流程ollama 如何运行大模型前端部署注意事项简介 本指南旨在帮助初学者在本地环境中设置和运行DeepSeek大模型服务。本文将使用Ollama平台来简化这一过程,确保即使是新手也能顺…...

elementUI rules 判断 el-cascader控件修改值未生效

今天修改一个前端项目&#xff0c;增加一个多选字段&#xff0c;使用的是el-cascader控件&#xff0c;因页面是通过引用子页面组件形式使用&#xff0c;出现一个点选后再勾选原有值&#xff0c;输入框内不展示或取消后的也未正常隐藏&#xff0c;如果勾选的值是全新的则其他已选…...

讯方·智汇云校华为授权培训机构的介绍

官方授权 华为授权培训服务伙伴&#xff08;Huawei Authorized Learning Partner&#xff0c;简称HALP&#xff09;是获得华为授权&#xff0c;面向公众&#xff08;主要为华为企业业务的伙伴/客户&#xff09;提供与华为产品和技术相关的培训服务&#xff0c;培养华为产业链所…...

力扣-二叉树-257 二叉树的所有路径

思路 除去根节点&#xff0c;每一层添加->val&#xff0c;然后使用前序遍历的顺序 代码 class Solution { public:vector<string> res;void getTreePaths(string s, TreeNode* root){s "->";s to_string(root->val);if(root->left nullptr &…...

DeepSeek4j 已开源,支持思维链,自定义参数,Spring Boot Starter 轻松集成,快速入门!建议收藏

DeepSeek4j Spring Boot Starter 快速入门 简介 DeepSeek4j 是一个专为 Spring Boot 设计的 AI 能力集成启动器&#xff0c;可快速接入 DeepSeek 大模型服务。通过简洁的配置和易用的 API&#xff0c;开发者可轻松实现对话交互功能。 环境要求 JDK 8Spring Boot 2.7Maven/Gr…...

Vue.js 组件开发深入解析:Vue 2 vs Vue 3

Vue.js 是一个渐进式框架&#xff0c;旨在通过声明式渲染和组件化开发来提高开发效率和可维护性。组件是 Vue 应用的基本组成部分&#xff0c;几乎所有的功能都可以通过组件来实现。随着 Vue 3 的发布&#xff0c;Vue.js 引入了许多新的特性&#xff0c;使得组件的开发变得更加…...

MySQL数据库误删恢复_mysql 数据 误删

2、BigLog日志相关 2.1、检查biglog状态是否开启 声明: 当前为mysql版本5.7 当前为mysql版本5.7****当前为mysql版本5.7 2.1.1、Navicat工具执行 SHOW VARIABLES LIKE LOG_BIN%;OFF 是未开启状态&#xff0c;如果不是ON 开启状态需要开启为ON。{默认情况下就是关闭状态} 2.…...

PHP 基础介绍

PHP 学习资料 PHP 学习资料 PHP 学习资料 PHP 是一种广泛使用的开源服务器端脚本语言&#xff0c;尤其适合 Web 开发&#xff0c;能轻松嵌入 HTML 中&#xff0c;生成动态网页内容。接下来&#xff0c;让我们一起了解 PHP 的基础内容。 一、PHP 的安装与配置 在开始编写 PH…...

避雷,Ubuntu通过ollama本地化部署deepseek,open-webui前端显示

0.如题&#xff0c;预期在Ubuntu上本地化部署DeepSeek&#xff0c;通过浏览器访问达到chatgpt的对话效果。 1.裸机&#xff0c;安装Ubuntu。 原有的系统盘采用大白菜&#xff0c;下载24.04.1的镜像&#xff0c;插到电脑上&#xff0c;无法识别&#xff0c;重新查到笔记本&…...

package.json 文件配置

创建 Node.js 的配置文件 package.json npm init -y package.json 文件配置说明 配置说明示例name指定项目的名称&#xff0c;必须是小写字母&#xff0c;可以包含字母、数字、连字符&#xff08;-&#xff09;或下划线&#xff08;_&#xff09;&#xff0c;不能有特殊字符…...