雪花算法生成主键id
雪花算法
SnowFlake 算法,是 Twitter(一家美国社交网络及微博客服务的公司,致力于服务公众对话) 开源的分布式 id 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛,且ID 引入了时间戳,基本上保持自增的。
第一个部分,是 1 个 bit:0,这个是无意义的。
第二个部分是 41 个 bit:表示的是时间戳。
第三个部分是 5 个 bit:表示的是机房 id,10001。
第四个部分是 5 个 bit:表示的是机器 id,1 1001。
第五个部分是 12 个 bit:表示的序号,就是某个机房某台机器上这一毫秒内同时生成的 id 的序号,0000 00000000。
- 1 bit,是无意义的:
因为二进制里第一个 bit 为如果是 1,那么都是负数,但是我们生成的 id 都是正数,所以第一个 bit 统一都是 0。- 41 bit:表示的是时间戳,单位是毫秒。
41 bit 可以表示的数字多达 2^41 - 1,也就是可以标识 2 ^ 41 - 1 个毫秒值,换算成年就是表示 69 年的时间。- 10 bit:记录工作机器 id,代表的是这个服务最多可以部署在 2^10 台机器上,也就是 1024 台机器。
但是 10 bit 里 5 个 bit 代表机房 id,5 个 bit 代表机器 id。意思就是最多代表 2 ^ 5 个机房(32 个机房),每个机房里可以代表 2 ^ 5 个机器(32 台机器),这里可以随意拆分,比如拿出4位标识业务号,其他6位作为机器号。可以随意组合。- 12 bit:这个是用来记录同一个毫秒内产生的不同 id。
12 bit 可以代表的最大正整数是 2 ^ 12 - 1 = 4096,也就是说可以用这个 12 bit 代表的数字来区分同一个毫秒内的 4096 个不同的 id。也就是同一毫秒内同一台机器所生成的最大ID数量为4096
简单来说,你的某个服务假设要生成一个全局唯一 id,那么就可以发送一个请求给部署了 SnowFlake 算法的系统,由这个 SnowFlake 算法系统来生成唯一 id。这个 SnowFlake 算法系统首先肯定是知道自己所在的机器号,(这里姑且讲10bit全部作为工作机器ID)接着 SnowFlake 算法系统接收到这个请求之后,首先就会用二进制位运算的方式生成一个 64 bit 的 long 型 id,64 个 bit 中的第一个 bit 是无意义的。接着用当前时间戳(单位到毫秒)占用41 个 bit,然后接着 10 个 bit 设置机器 id。最后再判断一下,当前这台机房的这台机器上这一毫秒内,这是第几个请求,给这次生成 id 的请求累加一个序号,作为最后的 12 个 bit。
Springboot项目使用雪花算法
1.生成id
首先生成雪花id,这样虽然可以直接调用也就是通过new这个类的对象来生成,但是因为使用了spring框架,交给容器管理更好,所以下面就通过配置来实现将类注入到容器中
因为生成雪花id时要传入两个long型的参数,所以将这两个参数提到配置文件中来
application.yml
com:qiku:demo:snowflake:machine-id: 1data-center-id: 1
2、创建一个类 TestProperties ,来获取配置文件中的信息。
import com.linshan.demo1.entity.SnowflakeProperties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;@Data
@ConfigurationProperties(prefix = "com.qiku.demo")
public class TestProperties {private SnowflakeProperties snowflake;}
3.创建一个类SnowflakeProperties 来存需要传入的两个参数。
import lombok.Getter;
import lombok.Setter;@Getter
@Setter
public class SnowflakeProperties {private long machineId;private long dataCenterId;
}
4. 创建 BossAutoConfiguration 类
这里注意的是@EnableConfigurationProperties注解的作用是:使使用 @ConfigurationProperties 注解的类生效
import com.linshan.demo1.entity.SnowflakeManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@EnableConfigurationProperties(TestProperties.class)
public class BossAutoConfiguration {@Autowiredprivate TestProperties properties;@Bean@ConditionalOnMissingBeanpublic SnowflakeManager snowflakeManager() {return new SnowflakeManager(this.properties.getSnowflake().getMachineId(), this.properties.getSnowflake().getDataCenterId());}
}
5. 最后就是直接在需要使用的类中注入即可
@autowired
// 注入
private SnowflakeManeger snowflakeManager;
LunboEnitity lunboEnitity = new LunboEntity;
lunboEnitity .setImgUrl(path);
lunboEnitity .setId(SnowflakeManeger .nestValue());
lunboDao.insert(lunboEnitity );
returu path;
SnowFlake算法的优点:
(1)高性能高可用:生成时不依赖于数据库,完全在内存中生成。
(2)容量大:每秒中能生成数百万的自增ID。
(3)ID自增:存入数据库中,索引效率高。
SnowFlake算法的缺点:
依赖与系统时间的一致性,如果系统时间被回调,或者改变,可能会造成id冲突或者重复。
扩展:
雪花算法位数问题与源码分析
雪花算法生成主键id相关推荐
- 雪花算法及运用PHP,雪花算法生成全局唯一ID,参考了下网上雪花算法生成规则,机器ID和序列号自动获取 理论上毫秒可生成 1024*4096个唯一ID
任务要求毫秒生成10000个唯一ID 研究了下twitter/snowflake的算法思想: 参考了下网上雪花算法生成规则,把数据中心和机器编号整合一起,变成10位机器ID, 机器ID和序列号自动获取 ...
- java生成主键id,java自定义主键生成器
1. 实体类代码 @Entity @Data @Table(name = "user") public class User implements Serializable { @ ...
- 生成主键ID,唯一键id,分布式ID生成器雪花算法代码实现
工具类: package com.ihrm.common.utils;import java.lang.management.ManagementFactory; import java.net.I ...
- Java工具类--雪花算法生成全局唯一ID
import java.lang.management.ManagementFactory; import java.net.InetAddress; import java.net.NetworkI ...
- 使用redis批量生成主键ID
在多线程.高并发情况下,某些业务场景需要创建唯一标识的主键(订单)Id:通常情况下都是一个请求创建一个,考虑到性能和QPS我们会提前生成好一堆随机id保存到redis:从redis进行poll. 1. ...
- 分库分表的 9种分布式主键ID 生成方案
<sharding-jdbc 分库分表的 4种分片策略> 中我们介绍了 sharding-jdbc 4种分片策略的使用场景,可以满足基础的分片功能开发,这篇我们来看看分库分表后,应该如何为 ...
- 分库分表的 9种分布式主键ID 生成方案,挺全乎的
<sharding-jdbc 分库分表的 4种分片策略> 中我们介绍了 sharding-jdbc 4种分片策略的使用场景,可以满足基础的分片功能开发,这篇我们来看看分库分表后,应该如何为 ...
- java id主键_JAVA主键ID生成工具类:改自twitter的分布式ID算法snowflake
祝大家新年快乐,有任何问题可与我联系: 关于snowflake算法的介绍和原理这里不过多说明了,网上有很多. 这里简单描述下SnowflakeUtil的优点: 1.做为底层工具使用,可用于数据库主键. ...
- mybatis-plus雪花算法生成Id使用详解
文章目录 前言 一.mybatis-plus官网 二.雪花算法实战 1.建表 2.新建测试工程 3.单元测试 三.实现分析 四.为什么默认就是雪花算法 五.主动设置Id生成策略 六.内置的雪花算法工具 ...
- DefaultIdentifierGenerator 雪花算法 生成 重复 id 解决办法
DefaultIdentifierGenerator 雪花算法 生成 重复 id 前言 问题发生 排查原因 问题解决 前言 利用 mybatisplus 的 DefaultIdentifierGene ...
最新文章
- tomcat如何增大并发_系统的性能瓶颈,排查该从哪些方面入手,如何定位?
- r语言如何写入一个excel_R语言如何进行聚类分析?
- Matlab 条形图实例
- 深度学习与计算机视觉系列(2)_图像分类与KNN
- 通俗易懂!视觉slam第七部分——四元数
- 1114. Family Property (25)-PAT甲级真题(并查集)
- python之将python代码编译成.so
- 可视化管理一目了然 锐捷RG-UAC承载荔湾教育局“御网”之道
- 如何使用EasyRecovery的监控硬盘功能
- envi反演水质参数_基于大气校正法的Landsat 8 TIRS地表温度反演
- 深入解读Linux进程调度Schedule
- 计算机刷bios版本,详细教你电脑刷bios
- 探索生产计划排程(APS)的发展历程
- 计算机办公软件海报,word知识面制作一个图文并茂的宣传海报
- 青岛地区服务器不稳定怎么办,青岛联通现大面积DNS故障 用户该如何上网
- IT公司聘用应届生的标准是什么?到底看中应届生的什么?
- ironpython是什么意思_IronPython .NET Integration官方文档翻译笔记
- 华为推出打车平台 Petal,科技大厂再战聚合打车
- Linux正则表达式和文本处理工具(gred、awk、sed)
- matlab模拟风场竖桥向时程,大跨度桥梁三维脉动风场的计算机模拟
热门文章
- C++调用C#创建的COM组件
- 最新数据库可视化工具DataGrip安装教程
- java 格式化日期 星期_java 日期格式化
- java日期格式化 类_Java日期格式化(DateFormat类)
- 微博黄v怎么认证?怎么满足条件详解 身份认证|兴趣认证|视频认证
- SXWIN7X64EN_20181104_NET_msu_LITE英文精简版
- 7分钟学会匿名管道pipe()的使用(内附完整代码测试)
- ua获取手机型号_JavaScript获取移动设备型号的实现代码(JS获取手机型号和系统)...
- JAVA校园二手交易平台
- 解决微信小程序图片过大上传失败问题