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

雪花算法数据库主键

        雪花算法(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.xdnf.cn/news/18819.html

相关文章:

  • Shell 学习笔记 - Shell 三剑客篇
  • 【ABAP4】基本语法1
  • CI/CD企业案例详解
  • Linux下usb设备驱动涉及的结构体
  • 记一次生产环境Hbase填坑之路、Hbase客户端登陆、kerberos认证、端口列表、Pod上手撕代码【Hbase最佳实践】
  • 酶 EC number 预测工具CLEAN的安装和使用
  • Java 线程池详解:原理、使用与源码深度解析
  • 从全栈开发到微服务架构:一次真实的Java面试实录
  • 【图像处理基石】如何把非笑脸转为笑脸?
  • Git连接Github远程仓库的代理设置
  • Java:HashSet的使用
  • Linux shell脚本条件循环
  • 基础篇(下):神经网络与反向传播(程序员视角)
  • 【论文阅读 | arXiv 2025 | WaveMamba:面向RGB-红外目标检测的小波驱动Mamba融合方法】
  • Multitouch for mac 触控板手势增强软件
  • Zynq开发实践(Verilog、仿真、FPGA和芯片设计)
  • RAG智能问答为什么需要进行Rerank?
  • 【K8s】整体认识K8s之namespace
  • 低功耗模式DMA数据搬运问题解析
  • 模块测试与低功耗模式全攻略
  • 【Java】springboot的自动配置
  • 谷德红外温度传感器在 3D 打印领域应用探究
  • Rust 登堂 生命周期(一)
  • 纯血鸿蒙下的webdav库
  • 最近遇到的几个JVM问题
  • JVM OOM问题排查与解决思路
  • Flask蓝图:模块化开发的利器
  • HarmonyOS NEXT系列之元服务框架ASCF
  • 第04章 SPSS简介与数据库构建
  • 【机器学习】9 Generalized linear models and the exponential family