深入了解Snowflake雪花算法:分布式唯一ID生成器

在这里插入图片描述

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》本专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

深入了解Snowflake算法:分布式唯一ID生成器

  • 前言
  • Snowflake算法原理
  • Snowflake算法的优点
  • Snowflake算法Java代码实现
  • Snowflake算法使用注意事项
  • 结语

前言

在分布式系统中,生成唯一ID是一项关键的任务。Snowflake算法是Twitter公司开发的一种分布式唯一ID生成算法,通过对时间、机器ID和序列号的合理组合,保证在分布式环境中生成唯一的64位ID。本文将深入解析Snowflake算法的原理,并附带Java代码示例。

Snowflake算法原理

Snowflake算法的生成规则如下:

  • 固定值(1位):占用1bit,其值始终是0,可看做是符号位不使用。

  • 时间戳部分(41位): 用来记录生成ID的时间戳,精确到毫秒。这意味着Snowflake可以使用69年。

  • 机器ID部分(10位): 用来标识机器,可以部署在2^10台机器上。

  • 序列号部分(12位): 用来标识同一毫秒内产生的不同ID,支持同一机器同一毫秒内生成4096个ID。

雪花结构如下图
在这里插入图片描述

Snowflake算法的优点

Snowflake算法的优点:

  • 唯一性: Snowflake算法生成的ID在分布式环境中具有唯一性,通过合理的配置,可以避免ID冲突问题。

  • 趋势递增: 由于Snowflake算法使用时间戳作为基础,生成的ID呈趋势递增,便于数据库索引,有利于提高数据库性能。

  • 高性能: Snowflake算法的实现简单,性能较高,适用于大规模分布式系统。

  • 分布式: Snowflake算法天生支持分布式部署,适用于需要在多个节点生成唯一ID的场景。

  • 可定制性: Snowflake算法的位数分配是可以根据实际需求进行调整的,可以根据业务规模进行定制。

Snowflake算法的缺点:

  • 依赖系统时钟: Snowflake算法的唯一性依赖于系统时钟的单调递增,如果系统时钟回拨,可能导致生成的ID不唯一。

  • 时钟回拨问题: 如果系统发生时钟回拨,可能会导致生成的ID不是趋势递增的,影响数据库性能。

  • 有一定的时延: Snowflake算法生成ID时需要依赖当前时间戳,可能会有一定的时延。

  • 不适用于短时间内需要大量生成ID的场景: 在短时间内需要大量生成ID的场景下,可能会出现ID的序列号用尽的情况。

  • 对机器时钟要求较高: 如果机器之间的时钟差异较大,可能会导致生成的ID不唯一。

在使用Snowflake算法时,需要根据具体业务场景综合考虑其优缺点,确保在分布式环境中生成唯一且趋势递增的ID。

Snowflake算法Java代码实现

以下是一个简单的Java实现示例:

public class SnowflakeIdGenerator {private final long twepoch = 1288834974657L; // 起始时间戳,可以根据实际情况调整private final long workerIdBits = 5L;private final long dataCenterIdBits = 5L;private final long maxWorkerId = -1L ^ (-1L << workerIdBits);private final long maxDataCenterId = -1L ^ (-1L << dataCenterIdBits);private final long sequenceBits = 12L;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 SnowflakeIdGenerator(long workerId, long dataCenterId) {if (workerId > maxWorkerId || workerId < 0) {throw new IllegalArgumentException("Worker ID can't be greater than " + maxWorkerId + " or less than 0");}if (dataCenterId > maxDataCenterId || dataCenterId < 0) {throw new IllegalArgumentException("Datacenter ID can't be greater than " + maxDataCenterId + " or less than 0");}this.workerId = workerId;this.dataCenterId = dataCenterId;}public synchronized long nextId() {long timestamp = timeGen();if (timestamp < lastTimestamp) {throw new RuntimeException("Clock moved backwards. Refusing to generate id for " + (lastTimestamp - timestamp) + " milliseconds");}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;}private long tilNextMillis(long lastTimestamp) {long timestamp = timeGen();while (timestamp <= lastTimestamp) {timestamp = timeGen();}return timestamp;}private long timeGen() {return System.currentTimeMillis();}public static void main(String[] args) {// 示例用法SnowflakeIdGenerator idGenerator = new SnowflakeIdGenerator(1, 1);for (int i = 0; i < 10; i++) {long id = idGenerator.nextId();System.out.println("Generated ID: " + id);}}
}

Snowflake算法使用注意事项

时间回拨问题

如果系统时间发生回拨,可能会导致生成的ID不唯一。因此,在使用Snowflake算法时要确保系统时间是单调递增的。

机器ID和数据中心ID:

在部署时,要确保不同的机器和数据中心分配不同的ID,避免产生重复的ID。

性能

Snowflake算法依赖于系统时钟,如果系统时钟频繁变动,可能会影响性能。

结语

Snowflake算法是一种简单而高效的分布式唯一ID生成方案,广泛应用于分布式系统中。通过合理配置机器ID和数据中心ID,以及注意时间回拨问题,我们可以确保Snowflake算法生成的ID在分布式环境中的唯一性。在实际应用中,可以根据业务需求进行适当的调整和定制

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

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

相关文章

探索2024年软件测试的几大主导趋势

进入2024年&#xff0c;考虑影响测试环境的问题至关重要。这种思考将成为团队了解主要瓶颈和实现当今不断提高的期望的首要因素。 01 了解关键测试瓶颈 毋庸置疑&#xff0c;现代团队需要不断创新、适应和拥抱最新趋势&#xff0c;以保持竞争力并提供以客户为中心的解决方案。尽…

吴飞教授 人工智能 模型与算法 启发式搜索课件发散分析

一、文章介绍 本文是针对吴飞教授在MOOC课程 &#xff1a;《人工智能&#xff1a;模型与算法》 2.1节 启发式搜索的课前发散 在课程2.1节 启发式搜索章节中&#xff0c;吴飞教授以如何计算城市地图两点之间最短路径为例&#xff0c;重点讲授了贪婪最佳优先搜索和A*搜索算法&a…

Spring中事务控制的API介绍(PlatformTransactionManager和TransactionDefinition)

什么是事务&#xff1f; 当你需要一次执行多条SQL语句时&#xff0c;可以使用事务。通俗一点说&#xff0c;如果这几条SQL语句全部执行成功&#xff0c;则才对数据库进行一次更新&#xff0c;如果有一条SQL语句执行失败&#xff0c;则这几条SQL语句全部不进行执行&#xff0c;…

UE5 给自己的数字人重定向Mixamo动画

1 、准备动画骨格文件&#xff0c;动画文件&#xff0c;下面是Mixamo动画素材下载网站Mixamo动画骨格文件下载网站https://www.mixamo.com/2、下载动画骨格文件&#xff0c;打Mixamo网站&#xff0c;选择Characters骨格菜单&#xff0c;在下面找到对应的骨格。如下图所示&#…

C语言排序算法

排序的过程就是增加有序度&#xff0c;减少逆序度&#xff0c;最终达到满有序度 冒泡排序 #include <stdio.h> #include <stdbool.h>#define N 10void swap(int arr[],int i,int j) {int temp arr[i];arr[i] arr[j];arr[j] temp; } void bubble_sort(int arr[…

HTML5+CSS3小实例:人物介绍卡片2.0

实例:人物介绍卡片2.0 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><…

迟到的总结:回望 2023 年,期盼 2024 新机会、新挑战

&#x1f52d; 嗨&#xff0c;您好 &#x1f44b; 我是 vnjohn&#xff0c;在互联网企业担任 Java 开发&#xff0c;CSDN 优质创作者 &#x1f4d6; 推荐专栏&#xff1a;Spring、MySQL、Nacos、RocketMQ&#xff0c;后续其他专栏会持续优化更新迭代 &#x1f332;文章所在专栏…

定时器@Scheduled使用

四种调度方法 Scheduled 是 Spring Boot 中用于创建定时任务的注解。使用此注解可以很方便地实现定时任务的自动调度。以下是常见四种参数的作用&#xff1a; 固定延迟&#xff08;Fixed Delay&#xff09;: Scheduled(fixedDelay 1000)&#xff1a;在上一个任务完成后&#…

04-微服务-Nacos

Nacos注册中心 国内公司一般都推崇阿里巴巴的技术&#xff0c;比如注册中心&#xff0c;SpringCloudAlibaba也推出了一个名为Nacos的注册中心。 1.1.认识和安装Nacos Nacos是阿里巴巴的产品&#xff0c;现在是SpringCloud中的一个组件。相比Eureka功能更加丰富&#xff0c;在…

P4994 终于结束的起点————C

目录 终于结束的起点题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示样例 1 解释数据范围提示 解题思路Code运行结果 终于结束的起点 题目背景 终于结束的起点 终于写下句点 终于我们告别 终于我们又回到原点 …… 一个个…

WorkPlus AI助理为企业提供智能客服的机器人解决方案

在数字化时代&#xff0c;企业面临着客户服务的重要挑战。AI客服机器人成为了提升客户体验和提高工作效率的关键工具。作为一款优秀的AI助理&#xff0c;WorkPlus AI助理以其智能化的特点和卓越的功能&#xff0c;为企业提供了全新的客服机器人解决方案。 为什么选择WorkPlus A…

WinForms中的UI卡死

WinForms中的UI卡死 WinForms中的UI卡死通常是由于长时间运行的操作阻塞了UI线程所导致的。在UI线程上执行的操作&#xff0c;例如数据访问、计算、文件读写等&#xff0c;如果耗时较长&#xff0c;会使得UI界面失去响应&#xff0c;甚至出现卡死的情况。 解决方法 为了避免…