雪花算法

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相关推荐

  1. 雪花算法及运用PHP,雪花算法生成全局唯一ID,参考了下网上雪花算法生成规则,机器ID和序列号自动获取 理论上毫秒可生成 1024*4096个唯一ID

    任务要求毫秒生成10000个唯一ID 研究了下twitter/snowflake的算法思想: 参考了下网上雪花算法生成规则,把数据中心和机器编号整合一起,变成10位机器ID, 机器ID和序列号自动获取 ...

  2. java生成主键id,java自定义主键生成器

    1. 实体类代码 @Entity @Data @Table(name = "user") public class User implements Serializable { @ ...

  3. 生成主键ID,唯一键id,分布式ID生成器雪花算法代码实现

    工具类:  package com.ihrm.common.utils;import java.lang.management.ManagementFactory; import java.net.I ...

  4. Java工具类--雪花算法生成全局唯一ID

    import java.lang.management.ManagementFactory; import java.net.InetAddress; import java.net.NetworkI ...

  5. 使用redis批量生成主键ID

    在多线程.高并发情况下,某些业务场景需要创建唯一标识的主键(订单)Id:通常情况下都是一个请求创建一个,考虑到性能和QPS我们会提前生成好一堆随机id保存到redis:从redis进行poll. 1. ...

  6. 分库分表的 9种分布式主键ID 生成方案

    <sharding-jdbc 分库分表的 4种分片策略> 中我们介绍了 sharding-jdbc 4种分片策略的使用场景,可以满足基础的分片功能开发,这篇我们来看看分库分表后,应该如何为 ...

  7. 分库分表的 9种分布式主键ID 生成方案,挺全乎的

    <sharding-jdbc 分库分表的 4种分片策略> 中我们介绍了 sharding-jdbc 4种分片策略的使用场景,可以满足基础的分片功能开发,这篇我们来看看分库分表后,应该如何为 ...

  8. java id主键_JAVA主键ID生成工具类:改自twitter的分布式ID算法snowflake

    祝大家新年快乐,有任何问题可与我联系: 关于snowflake算法的介绍和原理这里不过多说明了,网上有很多. 这里简单描述下SnowflakeUtil的优点: 1.做为底层工具使用,可用于数据库主键. ...

  9. mybatis-plus雪花算法生成Id使用详解

    文章目录 前言 一.mybatis-plus官网 二.雪花算法实战 1.建表 2.新建测试工程 3.单元测试 三.实现分析 四.为什么默认就是雪花算法 五.主动设置Id生成策略 六.内置的雪花算法工具 ...

  10. DefaultIdentifierGenerator 雪花算法 生成 重复 id 解决办法

    DefaultIdentifierGenerator 雪花算法 生成 重复 id 前言 问题发生 排查原因 问题解决 前言 利用 mybatisplus 的 DefaultIdentifierGene ...

最新文章

  1. tomcat如何增大并发_系统的性能瓶颈,排查该从哪些方面入手,如何定位?
  2. r语言如何写入一个excel_R语言如何进行聚类分析?
  3. Matlab 条形图实例
  4. 深度学习与计算机视觉系列(2)_图像分类与KNN
  5. 通俗易懂!视觉slam第七部分——四元数
  6. 1114. Family Property (25)-PAT甲级真题(并查集)
  7. python之将python代码编译成.so
  8. 可视化管理一目了然 锐捷RG-UAC承载荔湾教育局“御网”之道
  9. 如何使用EasyRecovery的监控硬盘功能
  10. envi反演水质参数_基于大气校正法的Landsat 8 TIRS地表温度反演
  11. 深入解读Linux进程调度Schedule
  12. 计算机刷bios版本,详细教你电脑刷bios
  13. 探索生产计划排程(APS)的发展历程
  14. 计算机办公软件海报,word知识面制作一个图文并茂的宣传海报
  15. 青岛地区服务器不稳定怎么办,青岛联通现大面积DNS故障 用户该如何上网
  16. IT公司聘用应届生的标准是什么?到底看中应届生的什么?
  17. ironpython是什么意思_IronPython .NET Integration官方文档翻译笔记
  18. 华为推出打车平台 Petal,科技大厂再战聚合打车
  19. Linux正则表达式和文本处理工具(gred、awk、sed)
  20. matlab模拟风场竖桥向时程,大跨度桥梁三维脉动风场的计算机模拟

热门文章

  1. C++调用C#创建的COM组件
  2. 最新数据库可视化工具DataGrip安装教程
  3. java 格式化日期 星期_java 日期格式化
  4. java日期格式化 类_Java日期格式化(DateFormat类)
  5. 微博黄v怎么认证?怎么满足条件详解 身份认证|兴趣认证|视频认证
  6. SXWIN7X64EN_20181104_NET_msu_LITE英文精简版
  7. 7分钟学会匿名管道pipe()的使用(内附完整代码测试)
  8. ua获取手机型号_JavaScript获取移动设备型号的实现代码(JS获取手机型号和系统)...
  9. JAVA校园二手交易平台
  10. 解决微信小程序图片过大上传失败问题