<code id="nbzwf"></code>
  1. <var id="nbzwf"></var>
    1. <meter id="nbzwf"></meter>
        <option id="nbzwf"><menuitem id="nbzwf"></menuitem></option><listing id="nbzwf"><delect id="nbzwf"><p id="nbzwf"></p></delect></listing>
        • 基于.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位工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
          上文內容不用于商業目的,如涉及知識產權問題,請權利人聯系博為峰小編(021-64471599-8103),我們將立即處理。
        • 上一篇:.Net開發的兩個小技巧

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

        網站導航
        Copyright(C)51Code軟件開發網 2003-2019 , 滬ICP備05003035號-6
        北京快三路线温都水城

          <code id="nbzwf"></code>
        1. <var id="nbzwf"></var>
          1. <meter id="nbzwf"></meter>
              <option id="nbzwf"><menuitem id="nbzwf"></menuitem></option><listing id="nbzwf"><delect id="nbzwf"><p id="nbzwf"></p></delect></listing>

                <code id="nbzwf"></code>
              1. <var id="nbzwf"></var>
                1. <meter id="nbzwf"></meter>
                    <option id="nbzwf"><menuitem id="nbzwf"></menuitem></option><listing id="nbzwf"><delect id="nbzwf"><p id="nbzwf"></p></delect></listing>
                    开元棋牌网址玩 传奇电子琴谱 浙江体彩6十1预测今天 重庆时时怎么追豹子 黑龙江22选5开奖i查询结果 胜负彩01007期开奖 5分赛计划 手机看开奖结果494949 浙江十一选五开奖结果走势图 黑龙江福彩手机官方app下载