雪花算法生成id分析与实践

目录

1 什么是雪花算法?

结构

优点

缺点

2 在java中使用

使用注意: 

测试代码

效果


1 什么是雪花算法?

witter的雪花算法(Snowflake Algorithm)。雪花ID是一种分布式唯一ID生成算法,旨在解决分布式系统中生成唯一ID的需求。

结构

雪花ID的结构如下:

0 | 00000000000000000000000000000000000000 | 00000 | 00000 | 000000000000

- 第一位(最高位)是符号位,通常为0。

- 接下来的41位是时间戳,用于记录生成ID的时间。

- 然后是10位的工作机器ID,用于标识不同的机器。

- 一般来说工作机器ID分为工作节点ID和数据中心ID,各占5bit

 - 最后是12位的序列号,用于解决同一毫秒内生成多个ID的冲突问题。

通过这种结构,雪花ID可以在分布式系统中生成唯一的、有序的ID。

优点

高效、趋势递增、可排序,同时不依赖于外部数据库或网络。

缺点

雪花ID算法虽然在分布式系统中生成唯一ID的需求上有很多优点,但也存在一些潜在的缺点:

1. 依赖于机器时钟:雪花ID的时间戳部分依赖于生成ID的机器的系统时钟。如果机器的时钟发生回拨或不同步,可能会导致生成的ID不唯一或不正确。

2. 时钟回拨问题:如果机器的时钟回拨,可能会导致生成的ID比之前生成的ID要小。这可能会引发一些潜在的问题,例如在某些场景下无法正确排序或索引。

3. 高并发下的序列号重复:如果在同一毫秒内生成的ID请求非常高,可能会导致序列号部分不足以保证唯一性。这种情况下,需要额外的策略来解决并发生成ID的冲突。

4. 扩展性限制:雪花ID的结构中包含了工作机器ID和数据中心ID,这限制了系统的扩展性。如果需要增加机器或数据中心数量,可能需要重新分配ID范围或修改算法。

5. 需要单点生成ID:为了保证ID的唯一性,需要集中式的ID生成器来分配工作机器ID和数据中心ID。这可能成为系统的单点故障或性能瓶颈。

尽管雪花ID算法存在一些缺点,但在大多数情况下,它仍然是一种可行且广泛使用的分布式唯一ID生成方案。根据具体的应用场景和需求,可以考虑使用其他ID生成算法或采取额外的措施来解决这些缺点。

2 在java中使用

我们直接借助hutool工具包帮我们实现了雪花算法

依赖

        <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency>


使用注意: 

工作机器ID分为工作节点ID和数据中心ID,各占5bit,所以workerID和datacenterId最大31

测试代码

    /** 测试 */public static void main(String[] args) {// workerID和datacenterId最大31Snowflake snowflake = IdUtil.getSnowflake(0, 31);for (int i = 0; i < 10; i++) {System.out.println(snowflake.nextId());}}

效果

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

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

相关文章

业绩走低,毛利率下滑,海外市场能否成为极米科技救命稻草?

撰稿|行星 来源|贝多财经 8月30日&#xff0c;成都极米科技股份有限公司&#xff08;SH:688696&#xff0c;下称“极米科技”&#xff09;发布2023年半年度业绩报告。财报显示&#xff0c;极米科技2023年上半年的业绩出现了大幅下滑&#xff0c;其中收入同比减少两成&#xf…

代码随想录二刷day06

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣242. 有效的字母异位词二、力扣349. 两个数组的交集三、力扣202. 快乐数四、力扣1两数之和 前言 一、力扣242. 有效的字母异位词 class Solution {pub…

数学建模-点评笔记 9月3日

1.摘要&#xff1a;关键方法和结论&#xff08;精炼的语言&#xff09;要说明&#xff0c;方法的合理性和意义也可以说明。 评委先通过摘要筛选&#xff08;第一轮&#xff09; 2.时间序列找异常值除了3西格玛还有针对时间序列更合适寻找的方法 3.模型的优缺点要写的详细一点…

世微AP9234 升压型DC/DC LED恒流驱动

描述 AP9234是一款由基准电压源、振荡电路、误差放大电路、相位补偿电路、电流限制电路等构成的CMOS升压型DC/DC LED驱动。由于内置了低导通电阻的增强型N沟道功率MOSFET&#xff0c;因此适用于需要高效率、高输出电流的应用电路。另外&#xff0c;可通过在VSENSE端子连接电流…

754. 到达终点数字

754. 到达终点数字 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a; 原题链接&#xff1a; 754. 到达终点数字 https://leetcode.cn/problems/reach-a-number/description/ 完成情况&#xff1a; 解题思路&#xff1a; 牛顿莱布尼茨梯…

softmax的cuda编程详细解读——算子融合

softmax介绍 在上一篇博客我们介绍了softmax的内容以及相关的编程实现,总结一下softmax的特点如下:(没有特殊说明的情况下,考虑的仍然只是1D向量 x x x) 1:获得向量的全局最大值M 2:针对向量 x ^ = { exp ⁡ ( x i −

vue3 组件通信方式

文章目录 组件通信方式props自定义事件全局事件总线v-modeluseAttrsref与$parentprovide与injectpiniaslot 组件通信方式 props ​ 实现父子组件通信,在vue3中可以通过defineProps获取父组件传递的数据。且在组件内部不需要引入defineProps方法可以直接使用&#xff01; 父组…

SWAT-MODFLOW地表水与地下水耦合

耦合模型被应用到很多科学和工程领域来改善模型的性能、效率和结果&#xff0c;SWAT作为一个地表水模型可以较好的模拟主要的水文过程&#xff0c;包括地表径流、降水、蒸发、风速、温度、渗流、侧向径流等&#xff0c;但是对于地下水部分的模拟相对粗糙&#xff0c;考虑到SWAT…

ConsoleApplication815项目(直接加载+VEH Hook Load)

上线图 ConsoleApplication815.cpp #include <iostream> #include<Windows.h> #include "detours.h" #include "detver.h" #pragma comment(lib,"detours.lib")#pragma warning(disable:4996)LPVOID Beacon_address; SIZE_T Beacon…

leetcode分类刷题:哈希表(Hash Table)(三、循环存在问题)

1、当需要快速判断某元素是否出现在序列中时&#xff0c;就要用到哈希表了。 2、本文针对的总结题型为给定的序列或需要构造的序列中是否存在循环&#xff0c;与 160. 相交链表、 141. 环形链表、142. 环形链表 II的题型一样。 202. 快乐数 这道题还考察如何对正整数求解各个位…

用js的moment插件判断日期的格式是否符合‘YYYY-MM-DD‘

可以使用moment插件中的isValid()方法来判断一个日期字符串是否符合YYYY-MM-DD格式。 示例代码&#xff1a; const dateStr 2021-08-01; const dateFormat YYYY-MM-DD;const isValidDate moment(dateStr, dateFormat, true).isValid();console.log(isValidDate); // true这…

敏捷开发、V模型开发、瀑布模型

在软件开发领域&#xff0c;敏捷开发和V模型开发是两种主要的开发方法。它们之间的差异主要体现在开发过程的结构和组织方式上。在以下讨论中&#xff0c;我们将深入探讨这两种方法的特点和差异。 敏捷开发 敏捷开发是一种迭代和增量的软件开发方法&#xff0c;它强调灵活性和…

初识matlab

清空环境变量及命令 clear all 清除Workspace中的所有变量clc 清除Command Window中的所有命令 变量名命名规则 变量名区分大小写变量名长度不超过63位变量名以字母开头&#xff0c;可以由字母、数字和下划线组成&#xff0c;但不能使用标点变量名应简洁明了&#xff0c;通过…

Redis执行lua脚本-Time函数-获取当前时间

演变过程&#xff1a; TIME 命令返回当前服务器的时间&#xff0c;包含两个条目 Unix 时间戳和这一秒已经过去的微秒数。 eval " local res redis.call(time); return res; " 0 eval " local current_time redis.call(TIME) local unix_timestamp tonumb…

rz命令无法正常使用?

使用rz命令上传文件时出现如下问题&#xff1a; 这里用的是mobaxterm终端 改用xshell,secureCRT即可正常使用&#xff1a;

vscode调教配置:快捷修复和格式化代码

配置vscode快捷键&#xff0c;让你像使用idea一样使用vscode&#xff0c;我们最常用的两个功能就是格式化代码和快捷修复&#xff0c;所以这里修改一下快捷修复和格式化代码的快捷键。 在设置中&#xff0c;找到快捷键配置&#xff1a; 然后搜索&#xff1a;快捷修复 在快捷键…

STM32f103入门(3)按键控制LED灯以及光敏传感器控制LED

按键控制 技术点 控制LED的 GPIO 设置为输出控制按键的GPIO 设置为上拉输入 按键部分代码 Key.c #include "stm32f10x.h" #include "Delay.h" void Key_Init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_InitSt…

AJAX请求

一、HTTP 1、请求报文 行 POST /s?ieutf-8 HTTP/1.1 头 HOST: ceshi.comCookie: namehelloContent-type: application/x-www-form-urlencodedUser-Agent: chrome 83 空行 体 usernameadmin&passwordadmin2、响应报文 行 HTTP/1.1 200 OK 头 Content-Type: text/htm…

Mqtt学习笔记--交叉编译移植(1)

简述 Mqtt目前在物联网行业的应用比较多&#xff0c;mqtt属于应用层的一个中间件&#xff0c;这个中间件实现消息的订阅发布机制。网上介绍Mqtt的实现原来的比较多&#xff0c;这里不细介绍。 其实在我们之前的产品中&#xff0c;自己也开发的有类似的中间件&#xff0c;除了具…

ORB-SLAM2算法12之单目初始化Initializer

文章目录 0 引言1 单目初始化Initializer1.1 构造函数1.2 成员函数1.2.1 Initialize1.2.2 FindHomography1.2.3 FindFundamental1.2.4 ReconstructH1.2.5 ReconstructF 2 总结 0 引言 ORB-SLAM2算法7详细了解了System主类和多线程、ORB-SLAM2学习笔记8详细了解了图像特征点提取…