分布式ID生成方案之雪花算法

目录

前言

1、什么是分布式ID?

2、雪花算法结构

3、雪花算法的优势

4、雪花算法的实现

5、总结


前言

当我首次接触到这个算法时,便被其富有诗意的名字所吸引。雪花,亦称未央花,"未央"意味着永恒与无限,象征着希望与未来,代表着光明与前行的道路。言归正传,自然界中存在一种现象:据说不存在两片完全相同的雪花,每一片在形成时都会展现出其独特的形态与纹路。雪花算法这个名字,象征该算法能生成一个全局唯一且不重复的标识符。

1、什么是分布式ID?

在分布式系统中,数据一般都被分散存储在不同的节点上,由于数据被分散存储在不同的节点上,为了确保每个数据项的唯一性,就需要这样一套机制来生成不会重复的ID。这个不会重复的ID就是分布式ID。

分布式ID不仅仅是一个简单的数字序列,它还涉及到多个维度的需求和特性,主要包括:

  1. 全局唯一性:这是最基本也是最重要的要求,确保在分布式系统中产生的每一个ID都是独一无二的。

  2. 高性能:在高并发场景下,ID生成服务需要快速响应,减少生成ID的延迟,不影响系统的整体性能。

  3. 高可用性:ID生成服务需要设计成高可用的,即使部分组件发生故障,也能确保ID的正常生成,不影响业务连续性。

  4. 趋势递增(非严格要求):在某些场景下,如数据库索引优化,可能需要生成的ID具有趋势递增的特性,以便提升数据库插入性能。

  5. 安全性:虽然不是所有场景都需要,但在一些敏感或有特殊要求的系统中,ID的生成还应考虑信息安全性,避免通过ID泄露系统敏感信息。

常见的分布式ID生成策略有Snowflake算法(就是我们今天的主角)、基于数据库的生成方式、基于Zookeeper或Redis等中间件的方案,以及使用UUID等。

接下来我们就一起解开雪花算法的面纱吧。

2、雪花算法结构

雪花算法是Twitter开源的分布式ID生成算法,其生成的ID是一个64位的长整型数字。每个ID按时间顺序生成,并保证在分布式系统中的唯一性。雪花算法生成的ID结构如下:

| 1位符号位 | 41位时间戳 | 10位机器ID | 12位序列号 |
  • 1位符号位:固定为0,表示生成的ID为正数。
  • 41位时间戳:以毫秒为单位的时间戳,表示从某个固定时间(Twitter Epoch)起的毫秒数,41位可以表示69年的时间。
  • 10位机器ID:用来表示不同的机器,5位数据中心ID和5位机器ID,最多支持1024个节点。
  • 12位序列号:同一毫秒内生成的不同ID的序列号,最多支持每毫秒产生4096个不同的ID。

3、雪花算法的优势

  1. 高效性:雪花算法在本地生成ID,不需要依赖数据库等外部系统,生成速度极快。
  2. 全局唯一性:通过时间戳、机器ID和序列号的组合,保证了ID的唯一性。
  3. 有序性:生成的ID大致按照时间顺序排列,方便数据的排序和查询。
  4. 分布式支持:支持大规模分布式系统,每秒可以生成大量唯一ID。

4、雪花算法的实现

public class SnowflakeIdWorker {// 起始时间戳(2020-01-01)private final long twepoch = 1577836800000L;// 机器ID所占的位数private final long workerIdBits = 5L;private final long datacenterIdBits = 5L;// 支持的最大机器IDprivate final long maxWorkerId = -1L ^ (-1L << workerIdBits);private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);// 序列号所占的位数private final long sequenceBits = 12L;// 机器ID左移位数private final long workerIdShift = sequenceBits;private final long datacenterIdShift = sequenceBits + workerIdBits;private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;// 序列号掩码private final long sequenceMask = -1L ^ (-1L << sequenceBits);private long workerId;private long datacenterId;private long sequence = 0L;private long lastTimestamp = -1L;public SnowflakeIdWorker(long workerId, long datacenterId) {if (workerId > maxWorkerId || workerId < 0) {throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));}if (datacenterId > maxDatacenterId || datacenterId < 0) {throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));}this.workerId = workerId;this.datacenterId = datacenterId;}public synchronized long nextId() {long timestamp = timeGen();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) & sequenceMask;if (sequence == 0) {timestamp = tilNextMillis(lastTimestamp);}} else {sequence = 0L;}lastTimestamp = timestamp;return ((timestamp - twepoch) << timestampLeftShift) |(datacenterId << datacenterIdShift) |(workerId << workerIdShift) |sequence;}protected long tilNextMillis(long lastTimestamp) {long timestamp = timeGen();while (timestamp <= lastTimestamp) {timestamp = timeGen();}return timestamp;}protected long timeGen() {return System.currentTimeMillis();}
}

5、总结

雪花算法是一种高效、可靠的分布式ID生成方案,解决了在分布式系统中ID重复和生成效率的问题。通过时间戳、机器ID和序列号的组合,确保了ID的全局唯一性和有序性。在实际应用中,雪花算法被广泛用于订单系统、用户系统等需要唯一标识符的场景,是一种非常实用的分布式ID生成方案。

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

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

相关文章

江苏 服务器性能监控包含哪些方面?

服务器的性能监控主要是为了确保服务器能够正常运行工作和性能优化的重要手段&#xff0c;接下来就来看一下服务器性能监控所包含的内容有哪些吧&#xff01; 首先对于服务器的系统资源进行一定的监控&#xff0c;CPU作为服务器的核心组件之一&#xff0c;所以我们要监控CPU的使…

【elementui】el-tree开启show-checkbox,点击叶子节点触发勾选

如图所示&#xff0c;el-tree开启show-checkbox&#xff0c;仅在点击红色区域(叶子节点)触发勾选&#xff0c;点击绿色区域(非叶节点)不触发勾选。 若是用开启check-on-node-click的方式&#xff0c;会出现点击非叶节点也触发勾选&#xff0c;由于我的tree是默认不展开的&#…

Spring (71)Spring Boot Actuator

Spring Boot Actuator是Spring Boot的一个子项目&#xff0c;提供了一系列生产级别的特性&#xff0c;帮助你监控和管理Spring Boot应用程序。Actuator通过HTTP、JMX或其他协议暴露应用程序的内部运行情况。这包括但不限于应用程序的健康状况、已配置的环境属性、线程情况、已注…

Java泛型,数据结构,List,Set详细介绍

泛型,数据结构,List,Set 介绍内容 泛型使用 数据结构 List Set 1 泛型 1.1 泛型的介绍 泛型是一种类型参数&#xff0c;专门用来保存类型用的 最早接触泛型是在ArrayList&#xff0c;这个E就是所谓的泛型了。使用ArrayList时&#xff0c;只要给E指定某一个类型&#xf…

戴尔外星人原厂系统美版改国行正确识别本机SN,支持F12 Support Assist OS Recevory恢复重置识别SN服务编码

1.重新部署可以永久正确识别My Alienware和Support Assist服务编码 原厂系统远程恢复安装&#xff1a;https://pan.baidu.com/s/166gtt2okmMmuPUL1Fo3Gpg?pwdm64f 提取码:m64f 2.安装有两个软件和官网主页会识别原机的SN码&#xff0c;就是本机服务编码&#xff08;my Alie…

excel如何实现按班级统计?

这个表有1-20个班(上表班级排名可以忽略不计)&#xff0c;需要计算每个班级的总分排名的各段人数&#xff0c;分段要求是0-60名&#xff0c;61-200名&#xff0c;201-600名。最后结果如下。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 如果年级有600…

ArcGIS查找相同图斑、删除重复图斑

​ 点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 点击学习——>遥感影像综合处理4大遥感软件ArcGISENVIErdaseCognition 这次是上次 今天分享一下&#xff0c;很重要却被大家忽略的两个工具 这两个工具不仅可以找出属性…

视频AI分析定时任务思路解析

序言&#xff1a; 最近项目中用到视频ai分析&#xff0c;由于sdk涉及保密&#xff0c;不便透露&#xff0c;仅对定时任务分析的思路作出分享&#xff0c;仅供参考。 1、定时任务 由于ai服务器的性能上限&#xff0c;只能同时对64个rtsp流分析一种算法&#xff0c;或者对8个rts…

K8s yaml文件配置详解

1. 基础介绍 在Kubernetes&#xff08;K8S&#xff09;中&#xff0c;使用YAML文件来定义和配置资源对象是非常常见的。这些资源对象可以是Pod、Service、Deployment等&#xff0c;通过编写适当的YAML文件&#xff0c;可以告诉K8S如何创建、管理和操作这些资源。下面将介绍K8…

Qt creator day5练习

Qt 中实现TCP 聊天服务器 大致流程 创建套接字服务器QTcpServer对象 通过QTcpServer对象设置监听&#xff0c;即QTcpServer&#xff1a;&#xff1a;listen&#xff08;&#xff09; 基于QTcpServer&#xff1a;&#xff1a;newConnection&#xff08;&#xff09;信号检测…

LeetCode 算法:两两交换链表中的节点 c++

原题链接&#x1f517;&#xff1a;两两交换链表中的节点 难度&#xff1a;中等⭐️⭐️ 题目 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交…

find 查找 Bazel 构建覆盖率文件的一个☝️坑

Bazel 是由 Google 开发的一个高效、可扩展的开源构建和测试工具&#xff0c;主要用于管理大型代码库。它支持多语言&#xff08;如 C, Java, Python&#xff09;和多平台构建&#xff0c;通过强大的构建缓存和并行化机制显著提高构建速度。 背景 利用Bazel构建项目时&#xf…

STM32单片机SPI通信详解

文章目录 1. SPI通信概述 2. 硬件电路 3. 移位示意图 4. SPI时序基本单元 5. SPI时序 6. Flash操作注意事项 7. SPI外设简介 8. SPI框图 9. SPI基本结构 10. 主模式全双工连续传输 11. 非连续传输 12. 软件/硬件波形对比 13. 代码示例 1. SPI通信概述 SPI&#x…

彻底卸载CAD2016两个关键点,解决许可过期问题

文章目录 1.使用自带卸载工具&#xff0c;避免卸&#xff5e;漏。 【开始菜单】-【Autodesk】-【Uninstall Tool】。 2.删除许可数据&#xff1a; 删除【C:\ProgramData\FLEXnet】下文件。 tips&#xff1a; 1.C:\ProgramData是隐藏文件夹。 2.FLEXnet&#xff1a;软件许可管…

keepalived高可用,LVS+keepalived的实现

概述&#xff1a; keepalived是集群高可用的一个技术&#xff0c;它是一个软件&#xff0c;与网络技术中VRRP协议的实现相类似&#xff0c;都是在若干个服务集群后虚拟出的一个对外提供服务的VIP(Virtual IP)&#xff0c;即虚拟IP&#xff0c;当某一台服务器发生故障时&#x…

腾讯云API安全保障措施?有哪些调用限制?

腾讯云API的调用效率如何优化&#xff1f;怎么使用API接口发信&#xff1f; 腾讯云API作为腾讯云提供的核心服务之一&#xff0c;广泛应用于各行各业。然而&#xff0c;随着API应用的普及&#xff0c;API安全问题也日益突出。AokSend将详细探讨腾讯云API的安全保障措施&#x…

数据结构之B树详解(极简)

一、引言 1&#xff09;介绍数据结构的重要性 在计算机科学中&#xff0c;数据结构是解决问题和优化性能的关键。它们是组织和存储数据的方式&#xff0c;直接影响着我们如何访问、检索和操作数据。一个恰当的数据结构选择可以显著提高算法的效率&#xff0c;降低时间复杂度和…

Scala 转义字符

Scala 转义字符 Scala作为一种多范式的编程语言,提供了丰富的转义字符集,用于在字符串中插入特殊字符。这些转义字符对于处理文件路径、正则表达式以及其他需要特殊字符的场合至关重要。本文将详细介绍Scala中的转义字符,并提供实际的应用示例。 什么是转义字符? 转义字…

Linux ls-al命令实现,tree命令实现,不带缓存的文件IO(open,read,write)

shell命令 ls -al 实现 #include <43func.h> void error_check(int ret, const char *msg) {if (ret -1) {perror(msg);exit(EXIT_FAILURE);} }char get_file_type(mode_t mode) {if (S_ISREG(mode)) return -;//检查给定的文件模式&#xff08;通常是从 stat 或 lst…

Linux——ansible中handlers

理解 1.按照已有的剧本写法 如果要完成下面这些操作&#xff1a; 1&#xff09;安装软件包&#xff1a;mysql&#xff0c;httpd&#xff0c;mysql-server&#xff0c;php 2&#xff09;复制配置文件&#xff1a;web&#xff0c;db&#xff0c;php 3&#xff09;后续追加配置文…