美文网首页
SNOWFLAKE雪花算法

SNOWFLAKE雪花算法

作者: Lucie_xxm | 来源:发表于2020-04-01 15:18 被阅读0次

对比

UUID

UUID (Universally Unique Identifier) 的标准型式包含 32 个 16 进制数字,以连字号分为五段,形式为 8-4-4-4-12 的 36 个字符,示例:550e8400-e29b-41d4-a716-446655440000,到目前为止业界一共有 5 种方式生成 UUID

  • 优点
    • 性能非常高:本地生成,没有网络消耗。
  • 缺点
    • 不易于存储:UUID 太长,16 字节 128 位,通常以 36 长度的字符串表示,很多场景不适用。
    • 信息不安全:基于 MAC 地址生成 UUID 的算法可能会造成 MAC 地址泄露,这个漏洞曾被用于寻找梅丽莎病毒的制作者位置。
    • ID 作为主键时在特定的环境会存在一些问题,比如做 DB 主键的场景下,UUID 就非常不适用:

注意:

  • MySQL 官方有明确的建议主键要尽量越短越好 [4],36 个字符长度的 UUID 不符合要求
  • 对 MySQL 索引不利:如果作为数据库主键,在 InnoDB 引擎下,UUID 的无序性可能会引起数据位置频繁变动,严重影响性能

SNOWFLAKE 雪花算法

雪花算法是由 Twitter 公布的分布式主键生成算法,它能够保证不同进程主键的不重复性,以及相同进程主键的有序性。在同一个进程中,它首先是通过时间位保证不重复,如果时间相同则是通过序列位保证。 同时由于 时间位是单调递增的,且各个服务器如果大体做了时间同步,那么生成的主键在分布式环境可以认为是总体有序的,这就保证了对索引字段的插入的高效性。例如 MySQL 的 Innodb 存储引擎的主键。

使用雪花算法生成的主键,二进制表示形式 包含 4 部分,从高位到低位分表为:1bit 符号位、41bit 时间戳位、10bit 工作进程位以及 12bit 序列号位。

image
  • 符号位 (1bit)

预留的符号位,恒为零。

  • 时间戳位 (4bit)

41 位的时间戳可以容纳的毫秒数是 2 的 41 次幂,一年所使用的毫秒数是:365 * 24 * 60 * 60 * 1000。通过计算可知:

Math.pow(2, 41) / (365 * 24 * 60 * 60 * 1000L);

结果约等于 69.73 年。ShardingSphere 的雪花算法的时间纪元从 2016 年 11 月 1 日零点开始,可以使用到 2086 年,相信能满足绝大部分系统的要求。

  • 工作进程位 (10bit)
    该标志在 Java 进程内是唯一的,如果是分布式应用部署应保证每个工作进程的 id 是不同的。该值默认为 0,可通过属性设置。
  • 序列号位 (12bit)

该序列是用来在同一个毫秒内生成不同的 ID。如果在这个毫秒内生成的数量超过 4096 (2 的 12 次幂),那么生成器会等待到下个毫秒继续生成。

注意: 该算法存在 时钟回拨 问题,服务器时钟回拨会导致产生重复序列,因此默认分布式主键生成器提供了一个最大容忍的时钟回拨毫秒数。 如果时钟回拨的时间超过最大容忍的毫秒数阈值,则程序报错;如果在可容忍的范围内,默认分布式主键生成器会等待时钟同步到最后一次主键生成的时间后再继续工作。 最大容忍的时钟回拨毫秒数的默认值为 0,可通过属性设置。

相关文章

  • snowflake雪花算法

    分布式系统中,一些业务场景需要获取全局唯一ID,常用方法为:twitter的snowflake、UUID/GUID...

  • SnowFlake(雪花算法)

    首先雪花算法就是生成一个64位的二进制数据,最终转换成长度为19的十进制正整数整型数据 解释一下这64位分别代表什...

  • SNOWFLAKE雪花算法

    对比 UUID UUID (Universally Unique Identifier) 的标准型式包含 32 个...

  • ID生成器之-Twitter雪花算法的Java实现

    SnowFlake Twitter 的 雪花算法 算法的 Java 实现版本。 算法思路 8字节(64位)占位的模...

  • Snowflake-雪花算法

    分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一...

  • 高并发和大流量的解决方案

    生成唯一ID-雪花算法:https://github.com/godruoyi/php-snowflake](ht...

  • 基于Redis生成全局ID

    上一篇 <<<基于Twitter的snowflake(雪花)算法实现全局ID[https://www.jiansh...

  • 雪花算法(SnowFlake)Java实现

    分布式id生成算法的有很多种,Twitter的SnowFlake就是其中经典的一种。 算法原理 SnowFlake...

  • 雪花算法(Snowflake)顺序ID

    分库分表场景下如何选择主键 数据库本身有自己的自增id,但在分库分表场景下,则无法保证主键的唯一,这时就需要可以替...

  • Java实现雪花算法(SnowFlake)

    雪花算法SnowFlake可以保证: 1.所有生成的id按时间趋势递增2.整个分布式系统内不会产生重复id(通过w...

网友评论

      本文标题:SNOWFLAKE雪花算法

      本文链接:https://www.haomeiwen.com/subject/ickauhtx.html