首页 > 其他分享 >雪花ID

雪花ID

时间:2024-03-06 10:00:27浏览次数:18  
标签:存储 机器 雪花 1L 序列 ID id

Twitter的分布式雪花算法SnowFlake,经测试每秒能够产生26万个自增可排序ID。

  1. twitter的SnowFlake生成ID能够按照时间有序生成;

  2. SnowFlake算法生成id的结果是一个64bit大小的整数,为一个Long型(转换成字符串后长度为19);

  3. 分布式系统内不会产生ID碰撞(由datacenter和workerId作区分)并且效率较高。

自增ID:对于数据敏感场景不宜使用,且不适合于分布式场景。
GUID:采用无意义字符串,数据量增大时造成访问过慢,且不宜排序。

号段解析

  • 1bit: 不用,因为二进制中最高位是符号位,1表示负数,0表示正数,生成的id一般都是用整数,所以最高位固定为0;
  • 41bit-时间戳: 用来记录时间戳,这个时间戳是当前时间和指定时间做差值得到结果,毫秒级;时间范围:(241 - 1)/ (365*24*60*60*1000L) = 67.73年;
  • 10bit-机器码: 用来记录工作机器的id(包含0),最大值为210= 1024;
  • 12bit-序列号: 用来记录同一毫秒内产生的不同id(包含0),最大值为212=4096。

单机器生成不碰撞序列的TPS:(212)*1000=409.6万。

SnowFlake可以保证: 所有生成的id按时间趋势递增,整个分布式系统内不会产生重复id。

使用建议

其实雪花算法就是把id按位打散,然后再分成上面这几块,用位来表示状态,这其实就是一种思想。
所以咱们实际在用的时候,也不必非得按照上面这种分割,只需保证总位数在64位即可。

如果你的业务不需要69年这么长,或者需要更长时间。

用42位存储时间戳,(1L << 42) / (1000L * 60 * 60 * 24 * 365) = 139年
用41位存储时间戳,(1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69年
用40位存储时间戳,(1L << 40) / (1000L * 60 * 60 * 24 * 365) = 34年
用39位存储时间戳,(1L << 39) / (1000L * 60 * 60 * 24 * 365) = 17年
用38位存储时间戳,(1L << 38) / (1000L * 60 * 60 * 24 * 365) = 8年
用37位存储时间戳,(1L << 37) / (1000L * 60 * 60 * 24 * 365) = 4年

如果你的机器没有那么1024个这么多,或者比1024还多。

用7位存储机器id,(1L << 7) = 128
用8位存储机器id,(1L << 8) = 256
用9位存储机器id,(1L << 9) = 512
用10位存储机器id,(1L << 10) = 1024
用11位存储机器id,(1L << 11) = 2048
用12位存储机器id,(1L << 12) = 4096
用13位存储机器id,(1L << 13) = 8192

如果你的业务,每个机器,每毫秒最多也不会4096个id要生成,或者比这个还多

用8位存储随机序列,(1L << 8) = 256
用9位存储随机序列,(1L << 9) = 512
用10位存储随机序列,(1L << 10) = 1024
用11位存储随机序列,(1L << 11) = 2048
用12位存储随机序列,(1L << 12) = 4096
用13位存储随机序列,(1L << 13) = 8192
用14位存储随机序列,(1L << 14) = 16384
用15位存储随机序列,(1L << 15) = 32768

注意,随机序列建议不要太大,一般业务,每毫秒要是能产生这么多id,建议增加机器,使用机器位。

雪花ID的优缺点

优点

  • 毫秒数在高位,自增序列在低位,整个ID都是趋势递增的。不依赖数据库等第三方系统,以服务的方式部署,稳定性更高,生成的Id的性能也是非常高的。可以根据自身业务特性分配bit位,非常灵活。

缺点

  • 强依赖机器时钟,如果机器上时钟回拨,会导致发号重复或者服务会处于不可用状态。可以记录上一次生成的时间戳,如果当前时间戳小于上次生成id的时间戳,则说明系统时钟出现了问题,如果时钟回拨的误差在5毫秒内的情况,在可以容忍的范围,让线程等待偏差的毫秒数,再重新生成,如果还是小于上次,则直接抛出异常,交给业务层处理。

改进

workId需要自身分配,且不同机器不能重复。可以建立workId表,自增主键作为workId。在应用启动时进行初始化,去workId表中查询机器ip对应的workId,不存在首先查找心跳时间在7天前的废弃workId记录,加锁,更新ip进行复用。否则进行初始化,插入一条记录到workId表中。心跳检测使用ScheduledThreadPoolExecutor,1小时上报一次,更新心跳时间。

create table `snowflake_machine_id`(
`id` int(11) unsigned not null auto_increment comment 'id',
`ip` varchar(20) default null comment '机器ip地址',
`heartbeat` datetime default null comment '上次心跳时间',
`ts` timestamp(6) not null default CURRENT_TIMESTSMP(6) ON UPDATE CURRENT_TIMESTAMP(6) comment '时间戳',
primary key ('id'),
unique key 'unique_ip' (`processid`) using btree
) CHARACTER SET utf-8 COLLATE utf8_general_ci comment '雪花ID算法机器ID表'

参考

https://www.zhihu.com/question/447384625

https://tech.meituan.com/2017/04/21/mt-leaf.html

标签:存储,机器,雪花,1L,序列,ID,id
From: https://www.cnblogs.com/zhengbiyu/p/18055855

相关文章

  • 【实用工具】IDEA常用快捷键
    ctrl+alt+insert:新建类/文件夹...shift+alt+上下 :单行上/下移动ctrl+d:复制行ctrl+x: 删除行Ctrl+Backspace:按单词删除Ctr+Shift+U:大小写转化alt+insert:快速生成set/get  equals/hashcode /overrideshift+f6:改类名/方法名refactorctrl......
  • AndroidStudio扫描局域网下的ESP32CAM并获取IP地址
    大概想法如下: 在ESP32CAM端直接下载示例代码udp_server这个历程,修改默认的WIFI和密码,启动之后会输出如下结果 由此我们知道了UDP的地址和端口IP地址为192.168.2.3,端口为3333此时我们使用小工具NetAssist.exe来测试,选择UDP协议之后向ESP32CAM的地址发送广播,如下图所示 ......
  • SpringBoot3整合Druid数据源的解决方案
    druid-spring-boot-3-starter目前最新版本是1.2.20,虽然适配了SpringBoot3,但缺少自动装配的配置文件,会导致加载时报加载驱动异常。<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-3-starter</artifactId><version>1.2.20</version......
  • Pokemon Go自動走路 iOS/Android 在家玩寶可夢不用出門 不用移動
    有時您可能想知道如何在不動的情況下玩PokemonGo。好消息是,我們將為您介紹PokemonGo自動步行,以偽造GPS位置。PokemonGo欺騙器將作為位置變換器引入。閱讀更多有關如何在PokemonGo中無需步行即可移動的方法。第1部分.是否可以不動地玩PokemonGO 在家玩寶可夢......
  • IDEA 如何配置Maven
    首先我们保证Maven环境配置已经没有问题的情况下,才可以进一步对idea进行配置,在此之前我们需要再做一步操作:能力有限不知道这一步叫啥但是知道这一步的操作步骤。首先找到Maven文件中的conf文件,其次建一个空文件找到conf文件里的setting.xml文件编辑它,在合适位置输入:空文件路......
  • 开源:Taurus.Idempotent 分布式幂等性锁框架,支持 .Net 和 .Net Core 双系列版本
    分布式幂等性锁介绍:分布式幂等性框架的作用是确保在分布式系统中的操作具有幂等性,即无论操作被重复执行多少次,最终的结果都是一致的。幂等性是指对同一操作的多次执行所产生的效果与仅执行一次的效果相同。以下是分布式幂等性框架的主要作用:避免重复操作:在分布式系统中,由于......
  • 3月5日-java随笔(雪花算法)
    一、简单介绍一下雪花算法原理1、雪花算法生成一个64bit的长整型标识符,其内部结构包含四个部分。首先,最左侧的一个bit通常被置为0作为符号位(在实际应用中往往无意义)。接下来的41bit用于存储自某个时间起点以来的毫秒级时间戳,以此确保生成的ID具有时间上的有序性。第三个组成部分......
  • 在IDEA中实现热部署
    什么是热部署?热部署(HotDeployment)是指在应用程序运行过程中,无需停止整个应用程序或重新启动服务器,就能够部署新的代码、资源或配置文件,使其立即生效。这种部署方式有助于提高开发效率和系统的可用性。有了热部署之后,当修改了代码的某部分,无需重新启动项目,就能把增量的内容自动......
  • Add correct host key in /root/.ssh/known_hosts to get rid of this message
    这是因为使用ssh登录后的服务器,因为某些原因被重置了,再次登录的使用的老的秘钥不再可以使用,这里需要删除重新设置查询cat/root/.ssh/known_hosts登录机器的ip以及对应的密码删除方法,删除ip对应的秘钥ssh-keygen-f"/root/.ssh/known_hosts"-R"192.168.31.10"......
  • PDFBox-Android添加图片被遮挡
    使用pdfbox-android在已存在的pdf上面追加图片,需要先创建PDPageContentStream,在创建的时候需要注意设置模式为APPEND,并且将resetContext参数设置为truevalcs=PDPageContentStream(document,......