雪花算法数据库主键

        雪花算法(Snowflake)作为一种分布式 ID 生成方案,在分布式系统中具有显著优势,能够解决多个关键问题。以下是它的核心好处及主要应用场景:

雪花算法的核心好处

  1. 全局唯一性:通过时间戳、机器 ID、数据中心 ID 和序列号的组合,确保在分布式环境下生成的 ID 绝对唯一
  2. 时间有序性:ID 包含时间戳信息,整体按时间趋势递增,对数据库索引友好
  3. 高性能:本地计算生成,无需网络请求,单机每秒可生成百万级 ID
  4. 无依赖:不依赖第三方中间件,节点可独立工作,降低系统复杂度
  5. 可扩展:支持最多 1024 个节点部署,可通过调整位数分配适配不同规模集群
  6. 节省空间:64 位长整数存储,比 UUID 更节省空间,计算和传输效率更高

雪花算法的主要应用场景

  1. 分布式数据库的全局唯一主键
  2. 订单系统的订单号生成
  3. 日志系统的追踪 ID
  4. 高并发场景下的 ID 生成(如秒杀、抢购)
  5. 分布式任务调度的任务 ID
  6. 消息队列的消息 ID

完整 Java 实现代码

public class SnowflakeIdGenerator {// 起始时间戳 (2020-01-01 00:00:00)private final long START_TIMESTAMP = 1577808000000L;// 机器ID所占的位数private final long WORKER_ID_BITS = 5L;// 数据中心ID所占的位数private final long DATA_CENTER_ID_BITS = 5L;// 支持的最大机器IDprivate final long MAX_WORKER_ID = ~(-1L << WORKER_ID_BITS);// 支持的最大数据中心IDprivate final long MAX_DATA_CENTER_ID = ~(-1L << DATA_CENTER_ID_BITS);// 序列在ID中占的位数private final long SEQUENCE_BITS = 12L;// 机器ID向左移12位private final long WORKER_ID_SHIFT = SEQUENCE_BITS;// 数据中心ID向左移17位(12+5)private final long DATA_CENTER_ID_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS;// 时间戳向左移22位(5+5+12)private final long TIMESTAMP_LEFT_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS + DATA_CENTER_ID_BITS;// 生成序列的掩码,这里为4095private final long SEQUENCE_MASK = ~(-1L << SEQUENCE_BITS);private long workerId;         // 机器IDprivate long dataCenterId;     // 数据中心IDprivate long sequence = 0L;    // 毫秒内序列private long lastTimestamp = -1L; // 上次生成ID的时间戳/*** 构造函数* @param workerId 机器ID (0~31)* @param dataCenterId 数据中心ID (0~31)*/public SnowflakeIdGenerator(long workerId, long dataCenterId) {if (workerId > MAX_WORKER_ID || workerId < 0) {throw new IllegalArgumentException(String.format("workerId 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("dataCenterId can't be greater than %d or less than 0", MAX_DATA_CENTER_ID));}this.workerId = workerId;this.dataCenterId = dataCenterId;}/*** 生成下一个ID* @return 雪花算法生成的唯一ID*/public synchronized long nextId() {long timestamp = System.currentTimeMillis();// 处理系统时钟回退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 = 0L;}// 更新上次生成ID的时间戳lastTimestamp = timestamp;// 组合生成IDreturn ((timestamp - START_TIMESTAMP) << TIMESTAMP_LEFT_SHIFT)| (dataCenterId << DATA_CENTER_ID_SHIFT)| (workerId << WORKER_ID_SHIFT)| sequence;}/*** 等待到下一毫秒*/private long tilNextMillis(long lastTimestamp) {long timestamp = System.currentTimeMillis();while (timestamp <= lastTimestamp) {timestamp = System.currentTimeMillis();}return timestamp;}// 测试public static void main(String[] args) {SnowflakeIdGenerator idGenerator = new SnowflakeIdGenerator(1, 1);// 生成10个IDfor (int i = 0; i < 10; i++) {long id = idGenerator.nextId();System.out.println("生成的ID: " + id);}}
}

        使用时,只需要为每个节点分配唯一的 workerId 和 dataCenterId 组合,然后调用 nextId () 方法即可生成唯一 ID。在分布式系统中,通常可以通过配置中心或启动参数来为每个节点分配这些 ID,确保不会重复。

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

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

相关文章

C/C++ 头文件命名约定

有的时候&#xff0c;在C的代码中&#xff0c;可以看到有如下的头文件引用的代码: #include <iostream> #include <unistd.h> #include <csignal>其中有一些是引用了.h文件&#xff0c;另外一些是引用了模块式的比如iostream和csignal&#xff0c;那么为什么…

异质结3.0时代的降本提效革命:捷造科技设备技术创新与产业拐点分析

光伏产业经历了从PERC到TOPCon和异质结&#xff08;HJT&#xff09;的技术迭代&#xff0c;而2025年将成为异质结技术规模化应用的关键转折点。捷造科技通过一系列突破性技术创新&#xff0c;将GW级异质结整线设备价格降至2亿元&#xff0c;较行业平均水平降低约40%&#xff0c…

【网络】http 协议中 Vary 标头的作用

在 HTTP 协议中&#xff0c;Vary 标头是一个关键的缓存控制机制&#xff0c;用于告知缓存服务器&#xff08;或代理&#xff09;&#xff1a;响应内容的生成依赖于请求中的哪些特定头部字段。其核心作用是确保缓存服务器能根据这些字段的差异&#xff0c;正确区分和返回不同版本…

CSS 进阶用法

一、选择器进阶复杂选择器组合详解后代选择器后代选择器使用空格分隔两个选择器&#xff0c;例如div p&#xff0c;表示选择div元素内所有的p元素。这种选择方式会匹配所有层级的后代元素&#xff0c;包括子元素、孙元素等任意深度的嵌套元素。应用示例&#xff1a;/* 选中arti…

GitHub 热榜项目 - 日榜(2025-08-23)

GitHub 热榜项目 - 日榜(2025-08-23) 生成于&#xff1a;2025-08-23 统计摘要 共发现热门项目&#xff1a;13 个 榜单类型&#xff1a;日榜 本期热点趋势总结 本期GitHub热榜呈现三大技术热点&#xff1a;1&#xff09;AI工作流构建成为风口&#xff0c;sim和airi等项目展示…

SHAP分析+KOA-RIME开普勒结合霜冰算法双重优化BP神经网络+9种映射方法+新数据预测!机器学习可解释分析!

代码主要功能 该Matlab代码实现了一个KOA-RIME开普勒结合霜冰算法双重优化的BP神经网络回归模型&#xff0c;结合特征贡献度分析&#xff08;SHAP&#xff09;和新数据预测功能。核心功能包括&#xff1a; 双重参数优化&#xff1a;先用智能算法&#xff08;以chebyshev映射改进…

【数据结构】栈和队列——栈

目录栈和队列栈栈的基本概念栈的顺序存储实现栈的定义与初始化入栈操作出栈操作读取栈顶元素判空和判满操作栈的销毁操作操作集合栈和队列 栈 栈的基本概念 栈的定义&#xff1a; 栈&#xff08;Stack&#xff09; 是一种线性表&#xff0c;它限定了数据元素的插入和删除操…

大数据管理与应用系列丛书《数据挖掘》读书笔记之集成学习(1)

文章目录前言一、集成学习是什么&#xff1f;1.基本思想2.集成学习的类型3. 集成学习的结合策略3.1 为什么结合策略是集成学习的灵魂&#xff1f;3.2 经典策略(1)**投票法&#xff08;Voting&#xff09;****(2)平均法&#xff08;Averaging&#xff09;****(3) 学习法**3.3 关…

嵌入式知识篇---32GUI

要理解 32 位单片机的 GUI&#xff0c;咱们先从 “基础概念” 入手&#xff0c;再拆成 “为什么能跑 GUI”“核心组成”“怎么实现”“常用工具”“实际用途” 这几步讲&#xff0c;全程不用复杂术语&#xff0c;像聊日常用品一样说清楚。一、先搞懂 2 个基础概念在讲 “32 位单…

【iOS】SDWebImage第三方库源码学习笔记

前言之前在写项目时&#xff0c;经常用到SDWebImage这个第三方库来加载图片&#xff0c;并且了解到了这个第三方库在处理图片时自带异步下载和缓存功能&#xff0c;以及对cell复用的处理。这篇文章来系统学习一下SDWebImage第三方库的知识以及底层原理简介SDWebImage为UIImageV…

Linux --网络基础概念

一.网络发展独立模式&#xff1a;在早期计算机之间是相互独立的&#xff0c;机器之间的数据只能通过软硬盘来传输&#xff0c;这就代表无法同时完成任务&#xff0c;需要前面的计算机完成各自的任务经过硬盘传递数据再完成自己的任务&#xff0c;效率十分低下。网络互联&#x…

教育系统搭建攻略:线上知识付费与线下消课排课全解析

作为一名资深平台测评师&#xff0c;最近我挖到了一个教育机构的 “宝藏工具”—— 乔拓云教育系统。别看它名字低调&#xff0c;用起来那叫一个顺手&#xff0c;线上知识付费、线下消课排课全给你安排得明明白白&#xff0c;简直是机构老板和教务员的 “摸鱼神器”。多端口管理…

PMP项目管理知识点-①项目基本概念

目录 1.项⽬的定义 概念&#xff1a; 特点&#xff1a; 项⽬与运营的区别 项⽬特点&#xff1a; 运营特点&#xff1a; 2.项⽬管理的发展 3.项⽬、项⽬集与项⽬组合 结构层次 4.项⽬的关键组成部分 项⽬⽣命周期&#xff1a; 项⽬管理过程组&#xff1a; 项⽬阶段&…

Python内置函数全解析:30个核心函数语法、案例与最佳实践指南

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 持续学习&#xff0c;不断…

数据建模怎么做?一文讲清数据建模全流程

目录 一、需求分析 1. 搞清楚业务目标&#xff1a;这数据是要解决啥问题&#xff1f; 2. 明确数据边界&#xff1a;哪些数据该要&#xff0c;哪些不该要&#xff1f; 3. 弄明白使用场景&#xff1a;谁用这数据&#xff0c;怎么用&#xff1f; 二、模型设计 1. 第一步&…

胸部X光片数据集:健康及肺炎2类,14k+图像

胸部X光片数据集概述 数据集包含14090张图像,分为正常胸部X光3901张,肺炎胸部X光10189张。 标注格式:无标注,文件夹分类。 图像尺寸:640*640 正常胸部X光: 肺炎胸部X光: 数据采集: 拍摄方式:均为前后位(anterior-posterior)胸部X光,属患者常规临床护理的一部分…

MySQL數據庫開發教學(二) 核心概念、重要指令

書接上回&#xff1a;MySQL數據庫開發教學(一) 基本架構-CSDN博客 建議工具&#xff1a; Navicat Premium (收費 / 需破解)&#xff1a;Navicat Premium | 管理和开发你的数据库 phpstudy 2018 (免費)&#xff1a;phpStudy - Windows 一键部署 PHP 开发环境 小皮出品 前言 …

【40页PPT】数字工厂一体化运营管控平台解决方案(附下载方式)

篇幅所限&#xff0c;本文只提供部分资料内容&#xff0c;完整资料请看下面链接 https://download.csdn.net/download/2501_92808811/91716541 资料解读&#xff1a;【40页PPT】数字工厂一体化运营管控平台解决方案 详细资料请看本解读文章的最后内容。该资料围绕数字工厂一体…

数据产品(2)用户画像数据分析模型

目录 1 用户画像 2 RFM模型 (用户价值分群模型) 3 PSM 价格敏感度 4 精细化运营 1 用户画像 也称用户表标签,是基于用户行为分析获得的对用户的一种认知表达,即用户数据标签化,通过收集与分析用户的用户属性(年龄、性别、城市、职业、设备、状态)、用户偏好(购物偏好,听…

03_数据结构

第3课&#xff1a;数据结构 课程目标 掌握Python的基本数据结构&#xff1a;列表、元组、字典、集合学习字符串的高级操作方法理解不同数据结构的特点和适用场景 1. 列表&#xff08;List&#xff09; 1.1 列表的创建和基本操作 # 创建列表 fruits ["苹果", "香…