概述

本篇文章主要讲述分布式ID生成算法中最出名的Snowflake算法。搞.NET开发的,数据库主键最常见的就是int类型的自增主键和GUID类型的uniqueidentifier。
那么为何还要引入snowflake呢?

INT自增主键

自增主键是解决主键生成的最简单方案,它有如下优势:

  1. 数据库本身负责主键生成,效率高

  2. 数据库本身保证主键顺序递增,方便存储和检索

相对应的,它也有如下缺点:

  1. 严重依赖数据库服务

  2. 强顺序递增,不易横向扩展

  3. 分库分表很难处理

  4. 不方便导入数据

  5. 上层应用在插入数据时,如果需要获知主键,必须再次查询

总结来说,INT自增主键在单机性能和主键严格递增上由很大的优势,但是在扩展性和分布式数据库上有较大限制

GUID主键

GUID(全局唯一标识符,Globally Unique Identifier)为128位(16字节),它使用太网卡地址、纳秒级时间、芯片ID码和许多可能的数字根据算法动态生成,理论上可以有2^128个结果,
所以产生2个相同的ID的几率非常小。

它的优点如下:

  1. 应用生成,解放服务器压力

  2. 生成的ID可以做到全库唯一,方便数据库分库分表、数据导入

缺点也很明显:

  1. 16字节太长,浪费空间

  2. 非顺序递增,增加数据库存储和检索开销

在做数据库主键选则时,如果系统较小,业务逻辑相对简单,可以考虑使用自增主键;如果业务复杂,涉及到分库分表分布式等,建议考虑GUID。如果认为GUID的缺点太影响使用,
可以考虑马上开始重点介绍的分布式ID生成算法 Snowflake

Snowflake是由Twitter提出并首先使用的分布式ID生成算法,使用它来生成分布式趋势递增的Id。

  1. 分布式
    Id有分布式系统的节点自己生成

  2. 趋势递增
    主键非严格顺序递增的,而是根数时间顺序递增,这在一定程度上保证了数据存储和索引的效率

算法讲解

总长度为64位长整型(8字节)

1位:首字节固定为0,来保证所有生成的数据都是正数

41位:第2到第42位工41字节,用于生成毫秒级时间戳,计算大概(2^41−1)/(1000∗60∗60∗24∗365)=69 年,对于一般系统来说绝对够用。

10位: 第43位到第52位为工作机ID,可表示2^10=1024台设备,一般高5位表示机房Id(datacenterId),低5位表示工作节点ID(workid)

12位:第53位到第64位表示序列号,2^12-1=4095

综上算法,表示单机每毫秒可以提供4095个Id,所有机器每毫秒可生成4095*1024=4194304个Id。

它的优点如下:

  1. 应用生成,解放服务器压力

  2. 生成的ID可以做到全库唯一,方便数据库分库分表、数据导入

  3. 8字节,长整型,节省空间

  4. 趋势递增,方便数据存储和查询

如何在.NET中实现该算法呢?下篇博客重点揭晓。

原文地址:https://www.cnblogs.com/leafly/p/10080774.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

基于.NET Standard的分布式自增ID算法--Snowflake相关推荐

  1. 基于.NET Standard的分布式自增ID算法--美团点评LeafSegment

    概述 前一篇文章讲述了最流行的分布式ID生成算法snowflake,本篇文章根据美团点评分布式ID生成系统文章,介绍另一种相对更容易理解和编写的分布式ID生成方式. 实现原理 Leaf这个名字是来自德 ...

  2. [详解]Twitter开源分布式自增ID算法snowflake,附演算验证过程

    1.snowflake简介 互联网快速发展的今天,分布式应用系统已经见怪不怪,在分布式系统中,我们需要各种各样的ID,既然是ID那么必然是要保证全局唯一,除此之外,不同当业务还需要不同的特性,比如像并 ...

  3. Twitter的分布式自增ID算法Snowflake实现分析及其Java、Php和Python版

    在分布式系统中,需要生成全局UID的场合还是比较多的,twitter的snowflake解决了这种需求,实现也还是很简单的,除去配置信息,核心代码就是毫秒级时间41位+机器ID 10位+毫秒内序列12 ...

  4. 分布式自增ID算法-Snowflake详解

    1.Snowflake简介 互联网快速发展的今天,分布式应用系统已经见怪不怪,在分布式系统中,我们需要各种各样的ID,既然是ID那么必然是要保证全局唯一,除此之外,不同当业务还需要不同的特性,比如像并 ...

  5. Twitter的分布式自增ID算法snowflake (Java版)

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

  6. Twitter的分布式自增ID算法snowflake

    全局ID 要做到幂等性的交易接口,需要有一个唯一的标识,来标志交易是同一笔交易.而这个交易ID由谁来分配是一件比较头疼的事.因为这个标识要能做到全局唯一. 如果由一个中心系统来分配,那么每一次交易都需 ...

  7. 分布式自增ID算法---雪花算法 (snowflake,Java版)---算法001

    一般情况,实现全局唯一ID,有三种方案,分别是通过中间件方式.UUID.雪花算法. 方案一,通过中间件方式,可以是把数据库或者redis缓存作为媒介,从中间件获取ID.这种呢,优点是可以体现全局的递增 ...

  8. 雪花算法id长度_【Java】分布式自增ID算法雪花算法 (snowflake,Java版)

    作者:H__D 转载自: https://www.cnblogs.com/h--d/p/11342741.html 一般情况,实现全局唯一ID,有三种方案,分别是通过中间件方式.UUID.雪花算法. ...

  9. 分布式自增ID算法---雪花算法(SnowFlake)Java实现

    分布式id生成算法的有很多种,Twitter的SnowFlake就是其中经典的一种. 算法原理 SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图: 1bit,不用,因为二 ...

最新文章

  1. c1083 “tensorflow/python/framework/c pp_shape_inference.pb.h”
  2. wxWidgets:在对话框之间共享信息
  3. 口述完SpringMVC执行流程,面试官就让同事回家等消息了
  4. (PMIC)全、半桥驱动器CSD95481RWJ PDF 规格
  5. LOJ10102旅游航道
  6. 开调查公司创业,他的公司营业额达80万
  7. linux 安装ros软路由,Centos7安装RouterOS软路由
  8. 计算机蓝屏无法启动不了系统怎么办,电脑蓝屏重启开不了机怎么回事_电脑蓝屏之后启动不了的处理办法-系统城...
  9. 阿里云免费个人Docker镜像仓库搭建
  10. 农业虫害识别相关论文——调研整理
  11. 互联网风控系统架构分析
  12. 【软件部署】Linux系统yum方式安装Jenkins
  13. 诺基亚收购Symbian触发移动开放平台大战
  14. 水晶报表的中文版下载
  15. 云存储——360云盘
  16. JDK 8 新特性之接口详解
  17. 区块链技术的浅尝辄止
  18. winform显示中国农历
  19. 多媒体文件服务器,多媒体文件分类方法和服务器
  20. 计算机操作员培训方案,计算机操作员培训计划.doc

热门文章

  1. 2018-08-15期 HBase命令行使用案例
  2. GPhone、OPhone、UPhone、APhone、IPhone:满城尽带XPhone
  3. Handler 机制分析
  4. com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input
  5. postgresql 查看page, index, tuple 详细信息
  6. Dell poweredge r210进BIOS修改磁盘控制器(SATA Controller)接口模式
  7. Facebook应用Moments使用C++实现跨平台代码共享
  8. NO.106 需求的状态、研发阶段及注意事项。
  9. 【C#语言规范】从FxCop归纳出来的一些规范建议
  10. 如何将 CSV 导入到 SqlServer 中 ?