分布式ID详解

分布式ID详解背景分布式 ID 用在分布式系统中在我们的业务需求中通常有需要一些唯一的 ID 来记录我们某个数据的标识 某个用户的 ID 某个订单的单号某个信息的 ID 为什么需要分布式 ID1 如果 id 我们使用的是数据库的自增长类型 在分布式系统中需要分库和分表 会有两个相同的表 有可能产生主键冲突分布式 ID 类型 全球唯一 不会冲突 UUID 全球唯一 字符串数据库表来维护 ID 新建一张表来产生 ID 使用哪种数据库由自己选择 Mysql MongoDB Redis 性能不好 字符串或数字类型雪花 ID 时间

背景

  • 某个用户的ID
  • 某个订单的单号
  • 某个信息的ID

为什么需要分布式ID

分布式ID类型:全球唯一,不会冲突

  • UUID:全球唯一:字符串
  • 数据库表来维护ID :新建一张表来产生ID,使用哪种数据库由自己选择Mysql、MongoDB、Redis,性能不好:字符串或数字类型
  • 雪花ID:时间戳的类型:数值:每次产生的数值会越来越大,递增型

选择的标准是什么?

在这里插入图片描述
当往B+树中插入字符串,不确定会往树的哪个地方插,这样会破坏这颗树,
结论

  • 字符串类型:不知道往树的哪个节点插,性能低
    而UUID使用的是字符串,如果存储在mysql中,会破坏底层B+树,从而造成性能比较低,因为你要根据id查询,到时候查询就会比较慢。

所以我们选用数值类型作为分布式ID
那么数值类型中又应该如何筛选呢
我在里面插入的数值是越来越大的,而且每次都是往树的右节点插入的
而最后,我插入小值时,就不确定它往树的哪边插入,这样就会像插入字符串一样,破坏树的结构
在这里插入图片描述
数值越来越大时,就会一直往树的最右节点插入
最终结论





  • 数值类型:递增的数字类型,数字永远在树的最右边,查询快,性能好
    而分布式id:要支持高并发,mysql的支持的并发量比较少,如果使用redis的话,要自己写一些算法策略,所以我们选择开源的分布式ID:雪花ID:推特公司推出的分布式id算法实现

雪花ID

  • 雪花算法会生成一个64位的二进制数据等于8byte[字节],为一个Long型。(转换成字符串后长度最多19) ,其基本结构:
    在这里插入图片描述

第一部分:备用

第二部分:时间戳:由于是二进制,所以是2的41次方得到毫秒值,再计算是年份69年,41位为毫秒级时间(41位的长度可以使用69年) 如果大于69年,就会使用第一部分,时间戳只会越来越大

第三部分:用来记录机器ID,一般用前5位代表数据中心,后面5位是某个数据中心的机器ID(10位的长度最多支持部署1024个节点【集群】)

第四部分:序列号:支持并发,逐渐递增 ,2的12次方=4096,也就是一毫秒内支持产生4096个id,一秒4096*100=,所以一台机器每秒的并发可以支持,但是经测试snowflake每秒能够产生26万个ID。

snowflake生成的ID整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和workerId作区分),并且效率较高。经测试snowflake每秒能够产生26万个ID。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/218423.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午7:17
下一篇 2026年3月18日 上午7:18


相关推荐

  • JavaScript事件冒泡

    JavaScript事件冒泡今天我要分享的 JavaScript 事件冒泡的知识点 1 知识点分享 JavaScript 事件冒泡主要是声明变量 获取点击事件 触发点击事件的动画 2 就是 JavaScript 的触发动画效果和点击事件 3 以下是 html 的知识点代码如下 4 还有 css 的样式代码如下图 给 body box innerBox 设置背景颜色 5 Js 代码如下图所示 首先获取 box 在获取 innerBox 给 innerBox 添加绑定点击事件 事件对象 event event 或 window e

    2026年3月17日
    2
  • SpringBoot集成Quartz动态定时任务「建议收藏」

    SpringBoot自带schedule沿用的springboot少xml配置的优良传统,本身支持表达式等多种定时任务注意在程序启动的时候加上@EnableScheduling@Scheduled(cron="0/5****?")publicvoidjob(){System.out.println("每五秒执行一次");}…

    2022年4月17日
    50
  • ThinkPHP 的缓存大概多久更新一次

    ThinkPHP 的缓存大概多久更新一次

    2021年11月3日
    48
  • Form.DialogResult 属性

    Form.DialogResult 属性设置或获取窗体的对话框结果命名空间:System.Windows.Forms程序集:System.Windows.Forms(在system.windows.forms.dll中)namespaceSystem.Windows.Forms{//摘要://Specifiesidentifierstoindicatethereturnva…

    2022年6月22日
    35
  • Ubuntu安装eclipse

    Ubuntu安装eclipseUbuntu 安装 eclipse 运行下面三条命令 tar zvxf eclipse inst jre linux64 tar gzcd eclipse install eclipse inst 选择对应组件安装 这里我选择的是 EclipseIDEfo 大家可以根据自己的需要选择对应的组件 然后默认安装即可 安装完成后 打开软件 如下图所示 大功告成 下面就是学习使用 Eclipse 进行开发了

    2026年3月19日
    2
  • EVT 极值理论「建议收藏」

    EVT 极值理论「建议收藏」EV参考:http://www.360doc.com/content/10/1225/05/974066_81117880.shtml

    2025年8月19日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号