背景:在很多业务场景下,我们都需要一个唯一的 ID 来进行一些数据的交互,那么如何生成这个唯一的 ID 呢?

如果在单机的情况下,生成唯一ID,可以利用机器内存的特点,通过内存分配即可。但我们线上的服务部署往往是多机器、多集群的。在这种情况下就要考虑分布式 ID 生成器了。如何确保数据唯一就显得很重要。

1、数据库自增ID

最简单,使用最广泛的场景:单表设置一个自增 ID,我们很多情况下的数据查询、获取都是通过该方式。

但存在较明显的弊端:

1、受限于DB最大连接数,高并发场景下会占用连接数,增加DB压力。而且主从延迟的情况下会出现数据获取不准确的问题。

2、单表数据越来越大, 后期分库分表会存在压力,拓展能力差。

2、UUID

UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。

UUID由以下几部分组成:

1、当前日期时间。

2、时钟序列。

3、全局唯一的IEEE机器识别号,如果有网卡从网卡MAC地址获得,没有网卡以其他方式获得。

UUID目前使用普遍的是微软的GUID,其格式如下:

xxxxxxxx-xxxx- xxxx-xxxxxxxxxxxxxxxx(8-4-4-16),其中每个 x 是 0-9 或 a-f 范围内的一个十六

进制的数字。

示例:b6489592-4726-4d68-a52b-63e2bbddfbf3
1~8位采用系统时间,在系统时间上精确到毫秒级保证时间上的惟一性;
9~16位采用底层的IP地址,在服务器集群中的惟一性;
17~24位采用当前对象的HashCode值,在一个内部对象上的惟一性;
25~32位采用调用方法的一个随机数,在一个对象内的毫秒级的惟一性。复制代码

标准的UUID格式:

xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12)

注:关于 java 的 orm 不讨论。

缺点:

1、生成的结果串会比较长。

3、雪花算法

SnowFlake算法生成的唯一 id 是一个64bit大小的整数,它的结构如下图:

41bit (0, 2^41) 1589206824687 12bit

组成部分如下:

1、1bit 位不用,因为对于long类型,二进制中最高位是符号位,1代表负,0代表正。

2、41bit 时间位,记录的为毫秒级别的时间戳。取值范围为 (0, 2^41) ,举例:

当前毫秒级别时间戳:1589206824687
bit位表示:10111001000000100000110111011011011101111

3、10bit 机器 id (可划分为 5bit 的 datacenterId,5bit 的工作 workerId)

4、12bit 的序列号,用来记录同毫秒内产生的不同 id。

优势:

1、可以按照时间趋势递增

2、中间的机器位可以配合业务灵活的分配到其它位上,也可以借用其它区块的bit位

3、分布式系统内不会存在相同的两个id,因为有datacenterId、workerId来保证

缺点:

1、单机器出现时钟回拨,可能会出现 ID 冲撞。如何解决?可利用拓展位进行回拨记录。

来源:江湖百晓生

https://juejin.cn/post/6844904153894879239

ID生成器 雪花算法相关推荐

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

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

  2. ID 生成器 雪花算法

    想了解JVM的可以看这篇   https://mp.csdn.net/postedit/78686724 我们的业务需求中通常有需要一些唯一的ID,来记录我们某个数据的标识: 某个用户的ID 某个订单 ...

  3. 雪花算法id长度_分布式全局ID生成器(雪花算法golang无锁版)

    //github地址:https://github.com/chenjie199234/Corelib/tree/master/id var offset uint64 = uint64(time.D ...

  4. C语言雪花算法,ID 生成器 雪花算法

    python 获取脚本所在目录 平时写python经常会想获得脚本所在的目录,例如有个文件跟脚本文件放在一个相对的目录位置,那就可以通过脚本文件的目录找到对应的文件,即使以后脚本文件移到其他地方,脚本 ...

  5. 【黄啊码】百万级别订单量,如何生成唯一订单ID(雪花算法)

    Twitter-SnowFlake算法的产生是源于Twitter为了满足自己业务(每秒上万条消息的请求,每条消息都必须分配一条唯一的id,并且在分布式系统中不同机器产生的id必须不同)的需求. sno ...

  6. id长度 雪花算法_分布式系统中唯一ID算法之雪花算法

    背景 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的. 有些时候我们希望能使用一种 ...

  7. 分布式ID之雪花算法SnowFlake

    目录 1. 基本介绍 2.存在的问题 3.代码实现 整合SpringBoot使用 1. 基本介绍 最高位是符号位,始终为0,不可用. 41位的时间序列,精确到毫秒级,41位的长度可以使用69年.时间位 ...

  8. 分布式ID生成器及snowflake(雪花)算法实现

    分布式ID的特点 全局唯一性:不能出现有重复的ID标识,这是基本要求. 递增性:确保生成ID对用户或业务都是递增的. 高可用性:确保任何时候都能生成正确的ID. 高性能性:在高并发的环境下依旧表现良好 ...

  9. 关于雪花算法id冲突的思考解决思路

    1.背景: 公司的分布式应用部署了多个pod,  利用雪花算法来生成id, 然后用来保存数据, 但是生产上跑久了之后,偶尔间就会出现id碰撞的事情, 出现的概率非常小,但是一出现就会导致该笔业务处理失 ...

最新文章

  1. hbase.client.keyvalue.maxsize的默认值
  2. springboot 读取bootStrap.properties流程
  3. mysql 存储过程cursor_MySQL 的存储过程写法和Cursor的使用
  4. C++三路比较运算符
  5. 集中管理:领导者,不能不考虑的几件事之——“挖”出来的无限可能
  6. 用C#调用Windows API向指定窗口发送按键消息(转载)
  7. React项目build之后资源文件路径不正确或打开空白页的问题及简易解决方法
  8. 自动化测试学习之路--HTML常见元素、属性的简单学习
  9. java获取Timestamp类型的当前系统时间
  10. JAVA学生宿舍管理系统
  11. 华为android强刷系统下载地址,华为C8815官方rom固件刷机包下载_华为C8815系统强刷升级包...
  12. DBVisualizer导入excel数据
  13. Android图片太大导致无法正常显示
  14. 关于NB-IOT模块链接阿里物联网平台的学习笔记-记录
  15. ALM算法(增广拉格朗日法)
  16. 树以及二叉树的常用性质以及遍历
  17. 试看5分钟视频python_Python面试应急5分钟!
  18. MongoDB之查询文档
  19. tesseract语言库
  20. 求二阶系统输入单位斜坡响应matlab,二阶系统的斜坡响应教程.docx

热门文章

  1. Java:如何在不到5分钟的时间内通过Hazelcast提高生产力
  2. Java 10:“ var”关键字
  3. 使用Spring Security 5.0和OIDC轻松构建身份验证
  4. 工厂设计模式和策略设计模式_设计模式:策略
  5. Java接口–历年来Java 9之旅–默认和私有方法
  6. 高度有用的Java ChronoUnit枚举
  7. java 递归改非递归_使用Java ThreadLocals的意外递归保护
  8. 在JConsole和VisualVM中查看DiagnosticCommandMBean
  9. 具有Spring Boot和Yeoman的单页Angularjs应用程序
  10. jmc线程转储_如何分析线程转储– IBM VM