网站首页 > 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语言实现)
你 发表评论:
欢迎- 最近发表
-
- 五,网络安全IDA Pro反汇编工具初识及逆向工程解密实战
- 「JAVA8」- Lambda 表达式(java lambda表达式原理)
- 深入探讨Java代码保护:虚拟机保护技术的新时代
- Nginx反向代理原理详解(图文全面总结)
- 逆向拆解日本IT,哪些Java技术栈薪资溢价高
- mybatis 逆向工程使用姿势不对,把表清空了,心里慌的一比
- Spring Boot集成ProGuard轻松实现Java 代码混淆, Java 应用固若金汤
- 从 Java 代码逆向工程生成 UML 类图和序列图
- 人与人相处:尊重是标配,靠谱是高配,厚道是顶配
- Windows系统安装日期如何修改(windows10怎么修改安装日期)
- 标签列表
-
- 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)
本文暂时没有评论,来添加一个吧(●'◡'●)