zoukankan      html  css  js  c++  java
  • 基于.NET Standard的分布式自增ID算法--Snowflake

    概述

    本篇文章主要讲述分布式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中实现该算法呢?下篇博客重点揭晓。

  • 相关阅读:
    《Microsoft Sql server 2008 Internals》读书笔记第十一章DBCC Internals(2)
    《Microsoft Sql server 2008 Internals》读书笔记第十一章DBCC Internals(9)
    《Microsoft Sql server 2008 Internals》读书笔记第九章Plan Caching and Recompilation(10)
    CKEditor在asp.net环境下的使用一例
    《Microsoft Sql server 2008 Internals》读书笔记第五章Table(7)
    《Microsoft Sql server 2008 Internals》读书笔记第九章Plan Caching and Recompilation(11)
    千万数据的连续ID表,快速读取其中指定的某1000条数据?
    javascript中的float运算精度
    .Net与Java的互操作(.NET StockTrader微软官方示例应用程序)
    《Microsoft Sql server 2008 Internals》读书笔记第十一章DBCC Internals(6)
  • 原文地址:https://www.cnblogs.com/leafly/p/10080774.html
Copyright © 2011-2022 走看看