• <output id="56njw"></output>
    1. <dl id="56njw"></dl>

        <dl id="56njw"></dl>

        • 基于.NET Standard的分布式自增ID算法--Snowflake

          发布:51Code 时间: 2018-12-10 10:00

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

        • 概述

          本篇文章主要讲述分布式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?#36824;?1字节,用于生成毫秒级时间戳,计算大概(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
          上文内容不用于商?#30340;?#30340;,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8103),我们将立即处理。
        • 上一篇:.Net开发的两个小技巧

          下一篇:.NET Core 最小化发布

        网站导航
        Copyright(C)51Code软件开发网 2003-2019 , 沪ICP备05003035号-6
        凤凰时时彩平台

      1. <output id="56njw"></output>
        1. <dl id="56njw"></dl>

            <dl id="56njw"></dl>

          1. <output id="56njw"></output>
            1. <dl id="56njw"></dl>

                <dl id="56njw"></dl>

                3.5波斯波利斯对塔什干棉农 第足彩胜负彩 比特币交易教程 拜金女郎手机下载 莱加内斯对阵皇马历史交锋 微信捕鱼达人怎么赚钱吗 幸运88彩票 毕尔巴鄂建筑 英魂之刃手游最强法师 宁夏11选5百度