分布式ID生成算法——雪花算法

这篇具有很好参考价值的文章主要介绍了分布式ID生成算法——雪花算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、分布式ID

ID可以唯一标识一条记录。

对于单体架构,我们可以使用自增ID来保证ID的唯一性。但是,在分布式系统中,简单的使用自增ID就会导致ID冲突。这也就引出了分布式ID问题。分布式ID也要求满足分布式系统的高性能、高可用、高并发的特点。

二、雪花算法

世界上不存在两片一样的雪花。

雪花算法(Snowflake),是Twitter公司提出的一种分布式ID生成算法,是分布式ID问题的经典解决方案。此算法生成的是一个64bit(8字节)的ID,在Java中使用8字节的long来存放,在数据库推荐用bigint来存储。

雪花ID结构如下所示,由1bit符号位 + 41bit时间戳 + 10bit工作机器ID + 12bit序列号组成。

分布式ID生成算法——雪花算法

  • 符号位:恒为0,保证生成的ID为正整数。
  • 时间戳:用于记录时间戳的毫秒数,通常选用项目上线时间作为时间戳的相对起点。41bit的时间戳可以保证69年的使用,对于普通的项目绝对是够用了。
  • 工作机器ID:10bit的机器ID可以分为两部分,机房ID + 机器ID。这两部分的长度分配没有具体要求,可以根据具体情况动态调整。
  • 序列号:用于区分在同一时间戳内,同一机器生成的ID。12bit一共可以标识4096个ID。

从上面的介绍中,我们不难看出雪花算法可以(优点):

  • 在高并发的情况下保证分布式ID的全局唯一性。
  • 生成的ID按照时间升序排列。
三、时钟回拨问题

时钟回拨,就是服务器上的时间突然倒退回之前的时间,时钟回拨会导致ID不唯一的问题。出现时钟回拨的原因可能是:

  • 人为更改系统时间。
  • 有时候不同的机器上需要同步时间,可能不同的机器存在误差,也会出现时钟回拨。

出现时钟回拨后,我们要怎么解决呢?根据回拨的时间长短的不同,可以采取不同的应对方案。文章来源地址https://www.toymoban.com/news/detail-456417.html

  • 如果回拨的时间较短,直接在这段时间内拒绝服务,不生成ID。
  • 如果回拨的时间较长,直接阻塞是不可取的。可以提前在机器ID或者序列号中留出拓展位置0,当出现时钟回拨时,将拓展位置1,这样也可以保证生成ID的唯一性。
四、其他分布式ID解决方案
  • UUID:Universally Unique Identifier,通用唯一识别码。但是存在长度过长(128bit)和完全随机(无序)两个缺点。如果在数据库中作为主键,一个与业务完全无关,二是更占存储空间且无序(用于索引效率低,详情请对照B+树)。
  • Redis自增:可以利用redis的原子操作incr来实现分布式ID,但是redis作为一个内存数据库,需要考虑持久化问题。如果用RDB方式持久化,redis宕机可能会导致ID重复。若采用AOF的每修改同步策略虽然能解决重复ID问题,但重启redis的恢复时间会很长。
  • 美团leaf算法:跟雪花算法其实是一个思想,这篇博客有详细讲☞传送门。

到了这里,关于分布式ID生成算法——雪花算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 分布式ID生成算法:雪花算法

    雪花算法(Snowflake)是一种分布式ID生成算法,可以生成唯一的、有序的、不重复的ID号,广泛应用于分布式系统中。其生成的ID号由64位二进制数组成,可以转换成16进制或10进制的字符串表示。 雪花算法的核心思想是将一个64位的二进制数分成四部分,分别表示时间戳、数据

    2024年02月15日
    浏览(40)
  • 分布式—雪花算法生成ID

    由64个Bit(比特)位组成的long类型的数字 0 | 0000000000 0000000000 0000000000 000000000 | 00000 | 00000 | 000000000000 1个bit:符号位,始终为0。 41个bit:时间戳,精确到毫秒级别,可以使用69年。 10个bit:工作机器ID,可以部署在1024个节点上。 12个bit:序列号,每个节点每毫秒内最多可以生成

    2024年02月11日
    浏览(44)
  • 分布式ID(2):雪花算法生成ID

    1 雪花算法简介 这种方案大致来说是一种以划分命名空间(UUID也算,由于比较常见,所以单独分析)来生成ID的一种算法,这种方案把64-bit分别划分成多段,分开来标示机器、时间等,比如在snowflake中的64-bit分别表示如下图(图片来自网络)所示: 41-bit的时间可以表示(1L

    2024年01月20日
    浏览(47)
  • 雪花算法生成分布式主键ID

    直接上代码,复制即可使用 在这个示例中,你可以通过 SnowflakeIdGenerator.init(dataCenterId, workerId); 初始化数据中心 ID 和工作 ID,然后通过 SnowflakeIdGenerator.generateId(); 静态方法生成 Snowflake ID 的字符串形式。

    2024年02月22日
    浏览(48)
  • 【Java笔记】分布式id生成-雪花算法

    随着业务的增长,有些表可能要占用很大的物理存储空间,为了解决该问题,后期使用数据库分片技术。将一个数据库进行拆分,通过数据库中间件连接。如果数据库中该表选用ID自增策略,则可能产生重复的ID,此时应该使用分布式ID生成策略来生成ID。 snowflake是Twitter开源的

    2024年02月11日
    浏览(43)
  • 【智能排班系统】雪花算法生成分布式ID

    在复杂而庞大的分布式系统中,确保数据实体的唯一标识性是一项至关重要的任务,生成全局唯一且有序的ID生成机制成为必不可少的环节。雪花算法(Snowflake Algorithm)正是为此目的而生,以其简洁的设计、高效的表现与良好的扩展性赢得了业界的广泛认可。 雪花算法最早由

    2024年04月10日
    浏览(85)
  • 分布式Id生成之雪花算法(SnowFlake)

    目录 前言 回顾二进制 二进制概念 运算法则 位(Bit) 字节(Byte) 字符 字符集 二进制原码、反码、补码 有符号数和无符号数 疑问:为什么不是-127 ~ 127 ? 为什么需要分布式全局唯一ID以及分布式ID得业务需求? ID生成规则部分硬性要求 ID生成系统的可用性要求 通用解决方

    2024年02月11日
    浏览(35)
  • 雪花算法,在分布式环境下实现高效的ID生成

    其实雪花算法比较简单,可能称不上什么算法,就是一种构造UID的方法。 点1:UID是一个long类型的41位时间戳,10位存储机器码,12位存储序列号。 点2:时间戳的单位是毫秒,可以同时链接1024台机器,每台机器每毫秒可以使用4096个序列号,我们会给生成id上一个同步锁,阻塞

    2024年02月15日
    浏览(56)
  • 对于现有的分布式id发号器的思考 id生成器 雪花算法 uuid

    目录 雪花id tinyid uuid 分布式id特点 业务编号 数据中心编号 当前时间 ip地址 当前序号 对于时钟回拨问题 发号器机器当期时间小于redis的时间 解决步骤 发号器机器当期时间等于redis时间 发号器机器当期时间大于redis最大的时间(相关的key不存在) 分布式id的单次获取和批次获

    2024年02月13日
    浏览(52)
  • 分布式id解决方法--雪花算法

    uuid,jdk自带,但是数据库性能差,32位呀。 mysql数据库主键越短越好,B+tree产生节点分裂,大大降低数据库性能,所以uuid不建议。 redis的自增,但是要配置维护redis集群,就为了一个id,还要引入一套redis。费事,成本高。 如果有序自增别人就知道你的业务量多少了。 分布式

    2024年02月04日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包