雪花Id生成算法,是鼎鼎有名的分布式Id生成算法。它的优点在于,在分布式系统中快速生成有时间顺序的唯一编号!Snowflake实测每秒可生成900万个唯一Id。

Nuget包:NewLife.Core

源码地址:

https://github.com/NewLifeX/X/blob/master/NewLife.Core/Data/Snowflake.cs

核心原理

使用一个 64 bit 的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛,且ID 引入了时间戳,基本上保持自增。

格式:1bit保留 + 41bit时间戳 + 10bit机器 + 12bit序列号

第一位不使用,主要是为了避免部分场景变成负数;

41位时间戳,也就是2的41次方,毫秒为单位,足够保存69年。这里一般存储1970年以来的毫秒数,建议各个系统根据需要自定义这个开始日期;

10位机器码,理论上可以表示1024台机器,也可以拆分几位表示机房几位表示机器。这里默认采用本机IPv4地址最后两段以及进程Id一起作为机器码,确保机房内部不同机器,以及相同机器上的不同进程,拥有不同的机器码;

12位序列号,表示范围0~4095,一直递增,即使毫秒数加一,这里也不会归零,避免被恶意用户轻易猜测得到前后订单号;

生成Id

NewId用于生成新的唯一Id

/// <summary>获取下一个Id</summary>
/// <returns></returns>
public virtual Int64 NewId();/// <summary>获取指定时间的Id,带上节点和序列号。可用于根据业务时间构造插入Id</summary>
/// <param name="time">时间</param>
/// <returns></returns>
public virtual Int64 NewId(DateTime time);

无参版默认使用当前时间生成唯一Id,也可以给指定时间生成唯一Id。

以下是采用雪花Id作为订单号。

解析Id

大型数据表,例如订单表、日志表等,可以使用Int64作为主键,然后使用雪花Id。因为雪花Id内带有时间戳信息,因此我们可以根据主键Id来直接搜索指定时间区间的数据。

/// <summary>时间转为Id,不带节点和序列号。可用于构建时间片段查询</summary>
/// <param name="time">时间</param>
/// <returns></returns>
public virtual Int64 GetId(DateTime time);

GetId用于计算指定时间的基准Id,只有最高的时间部分,机器码和序列化为零。我们在计算指定时间区间(start, end)内的数据时,可以有:

Select * from Order where Id>=Get(start) and Id<GetId(end);

拿到一个雪花Id,也可以从中解析得到时间等信息

/// <summary>尝试分析</summary>
/// <param name="id"></param>
/// <param name="time">时间</param>
/// <param name="workerId">节点</param>
/// <param name="sequence">序列号</param>
/// <returns></returns>
public virtual Boolean TryParse(Int64 id, out DateTime time, out Int32 workerId, out Int32 sequence);

解析订单号 152075078181383514 ,时间基准设为 2020年1月1日

总结

在分布式系统中,雪花Id具有非常重要的意义。星尘大量使用雪花Id,用于存储跟踪数据和采样数据,以前必须先插入跟踪数据得到自增Id然后才能插入采样数据(需要关联)的问题迎难而解,两者都可以同时走批量插入。

对于日志型数据表,强烈推荐使用雪花Id,因为它带有时间戳信息,等同于省去了CreateTime字段的索引。

雪花算法Snowflake相关推荐

  1. Twitter的分布式雪花算法 SnowFlake 每秒自增生成26个万个可排序的ID (Java版)

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

  2. Twitter的分布式雪花算法 SnowFlake

    为什么80%的码农都做不了架构师?>>>    原理 Twitter的雪花算法SnowFlake,使用Java语言实现. SnowFlake算法产生的ID是一个64位的整型,结构如下 ...

  3. java 有穷自动机_Java实现雪花算法(snowflake)

    本文主要介绍了Java实现雪花算法(snowflake),分享给大家,具体如下: 简单描述 最高位是符号位,始终为0,不可用. 41位的时间序列,精确到毫秒级,41位的长度可以使用69年.时间位还有一 ...

  4. mysql snowflake_雪花算法-snowflake

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

  5. java雪花_Java实现雪花算法(snowflake)

    本文主要介绍了Java实现雪花算法(snowflake),分享给大家,具体如下: 简单描述 最高位是符号位,始终为0,不可用. 41位的时间序列,精确到毫秒级,41位的长度可以使用69年.时间位还有一 ...

  6. 雪花算法snowflake分布式id生成原理详解,以及对解决时钟回拨问题几种方案讨论

    文章目录 一.前言 二.雪花算法snowflake 1.基本定义 2.snowflake的优缺点 三.Java代码实现snowflake 1.组装生成id 2.计算最大值的几种方式 3.反解析ID 4 ...

  7. 发号器:雪花算法(Snowflake)

    雪花算法(Snowflake)是twitter公司内部分布式项目采用的ID生成算法,开源后广受国内大厂的好评,在该算法影响下各大公司相继开发出各具特色的分布式生成器. 第一个bit位(1bit):Ja ...

  8. 雪花算法-Snowflake Snowflake

    雪花算法-Snowflake Snowflake,雪花算法是由Twitter开源的分布式ID生成算法,以划分命名空间的方式将 64-bit位分割成多个部分,每个部分代表不同的含义.而 Java中64b ...

  9. 雪花算法(snowflake)容器化部署支持动态增加节点

    先简单的介绍一下雪花算法,雪花算法生成的Id由:1bit 不用 + 41bit时间戳+10bit工作机器id+12bit序列号,如下图: 不用:1bit,因为最高位是符号位,0表示正,1表示负,所以这 ...

  10. long 雪花算法_雪花算法(snowflake)

    简单描述 最高位是符号位,始终为0,不可用. 41位的时间序列,精确到毫秒级,41位的长度可以使用69年.时间位还有一个很重要的作用是可以根据时间进行排序.注意,41位时间截不是存储当前时间的时间截, ...

最新文章

  1. 机器学习(MACHINE LEARNING)MATLAB和Python混合编程
  2. 018_Spring+ActiveMQ(消息中间件)
  3. 009-Joran配置框架
  4. 3D Reconstruction三维重建halcon算子,持续更新
  5. JAVA入门级教学之(什么是类加载)
  6. ​易生信-宏基因组2020 积微学术论坛:基于大数据整合准确预测土壤的枯萎病发生...
  7. 昨天晚上00:00睡觉,本来刘开着空调,我也没有找到来关掉
  8. Unity 5.x---00使用重力
  9. 【HenCoder Plus】第四期终于来了
  10. JAVA 滑块拼图验证码
  11. NetSuite 巧做打印模板
  12. SXF终端检测平台 EDR漏洞复现
  13. 台式计算机连接wifi适配器遇到问题,台式机连接wifi不稳定怎么办_台式电脑接wifi会不稳定解决方法-win7之家...
  14. 爸妈上班却顶着凛冽的寒风骑着自行车
  15. python制作界面_详解python做UI界面的方法
  16. 【阿里云云计算工程师ACP认证】什么是ACP
  17. pyspark入门---机器学习实战预测婴儿出生率(二)使用ML库
  18. Excel行高列宽使用单位为磅(1cm=28.6磅)
  19. linux与linux之间共享目录
  20. 简单讲解前序遍历,中序遍历,后序遍历和层次遍历

热门文章

  1. bzoj3122 [Sdoi2013]随机数生成器(bsgs+扩欧+数列)
  2. bzoj2132: 圈地计划
  3. 孤掌难鸣-------堵水眼
  4. 职场智慧之如何提升自己在公司的价值
  5. php程序layer,php 提交表单 关闭layer弹窗iframe的实例讲解
  6. Unity 3D学习笔记之一 界面介绍
  7. python 新闻摘要_每日新闻摘要:运营商承诺他们不再出售您的位置…
  8. 如何在Chrome中保存您当前的所有标签,以便以后阅读
  9. 设置单元格填充方式_单元格的选择及设置单元格格式
  10. Ubuntu系统备份工具大全(官方整理推荐)