网站首页 > java教程 正文
SnowFlake 雪花算法
SnowFlake算法生成的ID大致上是按照时间递增的,用在分布式系统中时,需要注意数据中心标识和机器标识必须唯一,这样就能保证每个节点生成的ID都是唯一的。它可以满足Twitter每秒上万条消息ID分配的请求,这些消息ID是唯一的且有大致的递增顺序,且是一个64位整形,即8字节,可以展示为一个Long类型的整数。结构如下(每一部分用“-”符号分隔):
- 1位标识部分,在java中由于long的最高位是符号位,正数是0,负数是1,一般生成的ID为正数,所以为0;
- 41位时间戳部分,这个是毫秒级的时间,一般实现上不会存储当前的时间戳,而是时间戳的差值(当前时间-固定的开始时间),这样可以使产生的ID从更小值开始;41位的时间戳可以使用69年,(1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69年;
- 10位节点部分,Twitter实现中使用前5位作为数据中心标识(Data Center ID),后5位作为机器标识(Worker ID),可以部署1024个节点;
- 12位序列号部分,支持同一毫秒内同一个节点可以生成4096个ID;
Snowflake算法核心
把时间戳,工作机器id,序列号组合在一起。
SnowFlake 的优点如下:
- 比UUID 短,一般为9-17位。
- 生成的ID是数字,可以做到单调递增。由于无法统一分布式环境中每台服务器的时钟,它只能做到单台机器单调递增,无法做到全局递增。
- 性能非常出色,吞吐量达到几十万TPS。
应用场景
参考上面的SnowFlake的优点,对应的应用场景如下。
1、数据库表主键:很多DBA在大型生产应用禁用auto_increment的ID,这时可以选SnowFlake替代。
2、TraceId:分布式系统追踪,希望用一个ID贯穿所有子系统来追踪分布式交互过程。如果系统产生一个Exception,我们需要对Exception编号等。
3、短时间内访问特别大,需要生成大量的唯一ID。
SnowFlake算法,Java版源代码
Github 源码地址:
https://github.com/rickiechina/CloudNative/blob/master/common/src/main/java/com/cloudnative/common/SnowflakeIdWorker.java
在具体的业务场景中,可以将上述代码进一步封装。
如想基于不同的table name,或者业务创建,实例化不同SnowflakeIdWorker 对象,然后存放在HashMap,在调用时,取出对应SnowflakeIdWorker对象,调用nextId() 方法。
Twitter 官方code:
https://github.com/twitter-archive/snowflake
- 上一篇: Java 程序员必会的「垃圾回收」算法
- 下一篇: java算法题-两数之和(两数相加 java)
猜你喜欢
- 2024-10-01 《Java常用算法手册》限免哦(java常见算法笔试题)
- 2024-10-01 java算法题-两数之和(两数相加 java)
- 2024-10-01 Java 算法篇-深入理解递归(递归实现:青蛙爬楼梯)
- 2024-10-01 Java 程序员必会的「垃圾回收」算法
- 2024-10-01 一文秒懂:多级时间轮,最顶尖的Java调度算法
- 2024-10-01 BAT大牛太强了,用46张PPT弄懂JVM、GC算法和性能调优
- 2024-10-01 写智能算法,到底是用java还是C++好?
- 2024-10-01 Java中的线性回归算法实现(java中的线性回归算法实现什么)
- 2024-10-01 软帝学院:这么常用的java基础算法,你可不能错过
- 2024-10-01 一个非常实用而且精妙的算法-并查集(java语言实现)
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)