<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          雪花算法Snowflake

          共 1138字,需瀏覽 3分鐘

           ·

          2021-02-23 20:13


          雪花Id生成算法,是鼎鼎有名的分布式Id生成算法。它的優(yōu)點(diǎn)在于,在分布式系統(tǒng)中快速生成有時(shí)間順序的唯一編號(hào)!Snowflake實(shí)測(cè)每秒可生成900萬個(gè)唯一Id。

          Nuget包:NewLife.Core

          源碼地址:

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


          核心原理

          使用一個(gè) 64 bit 的 long 型的數(shù)字作為全局唯一 id。在分布式系統(tǒng)中的應(yīng)用十分廣泛,且ID 引入了時(shí)間戳,基本上保持自增。

          格式:1bit保留 + 41bit時(shí)間戳 + 10bit機(jī)器 + 12bit序列號(hào)


          第一位不使用,主要是為了避免部分場(chǎng)景變成負(fù)數(shù);

          41位時(shí)間戳,也就是2的41次方,毫秒為單位,足夠保存69年。這里一般存儲(chǔ)1970年以來的毫秒數(shù),建議各個(gè)系統(tǒng)根據(jù)需要自定義這個(gè)開始日期;

          10位機(jī)器碼,理論上可以表示1024臺(tái)機(jī)器,也可以拆分幾位表示機(jī)房幾位表示機(jī)器。這里默認(rèn)采用本機(jī)IPv4地址最后兩段以及進(jìn)程Id一起作為機(jī)器碼,確保機(jī)房?jī)?nèi)部不同機(jī)器,以及相同機(jī)器上的不同進(jìn)程,擁有不同的機(jī)器碼;

          12位序列號(hào),表示范圍0~4095,一直遞增,即使毫秒數(shù)加一,這里也不會(huì)歸零,避免被惡意用戶輕易猜測(cè)得到前后訂單號(hào);


          生成Id

          NewId用于生成新的唯一Id

          /// 獲取下一個(gè)Id/// public virtual Int64 NewId();
          /// 獲取指定時(shí)間的Id,帶上節(jié)點(diǎn)和序列號(hào)??捎糜诟鶕?jù)業(yè)務(wù)時(shí)間構(gòu)造插入Id/// 時(shí)間/// public virtual Int64 NewId(DateTime time);

          無參版默認(rèn)使用當(dāng)前時(shí)間生成唯一Id,也可以給指定時(shí)間生成唯一Id。


          以下是采用雪花Id作為訂單號(hào)。


          解析Id

          大型數(shù)據(jù)表,例如訂單表、日志表等,可以使用Int64作為主鍵,然后使用雪花Id。因?yàn)檠┗↖d內(nèi)帶有時(shí)間戳信息,因此我們可以根據(jù)主鍵Id來直接搜索指定時(shí)間區(qū)間的數(shù)據(jù)。

          /// 時(shí)間轉(zhuǎn)為Id,不帶節(jié)點(diǎn)和序列號(hào)。可用于構(gòu)建時(shí)間片段查詢/// 時(shí)間/// public virtual Int64 GetId(DateTime time);

          GetId用于計(jì)算指定時(shí)間的基準(zhǔn)Id,只有最高的時(shí)間部分,機(jī)器碼和序列化為零。我們?cè)谟?jì)算指定時(shí)間區(qū)間(start, end)內(nèi)的數(shù)據(jù)時(shí),可以有:

          Select * from Order where Id>=Get(start) and Idend);

          拿到一個(gè)雪花Id,也可以從中解析得到時(shí)間等信息

          /// 嘗試分析/// /// 時(shí)間/// 節(jié)點(diǎn)/// 序列號(hào)/// public virtual Boolean TryParse(Int64 id, out DateTime time, out Int32 workerId, out Int32 sequence);

          解析訂單號(hào)?152075078181383514?,時(shí)間基準(zhǔn)設(shè)為 2020年1月1日

          總結(jié)

          在分布式系統(tǒng)中,雪花Id具有非常重要的意義。星塵大量使用雪花Id,用于存儲(chǔ)跟蹤數(shù)據(jù)和采樣數(shù)據(jù),以前必須先插入跟蹤數(shù)據(jù)得到自增Id然后才能插入采樣數(shù)據(jù)(需要關(guān)聯(lián))的問題迎難而解,兩者都可以同時(shí)走批量插入。

          對(duì)于日志型數(shù)據(jù)表,強(qiáng)烈推薦使用雪花Id,因?yàn)樗鼛в袝r(shí)間戳信息,等同于省去了CreateTime字段的索引。



          往期精彩回顧




          【推薦】.NET Core開發(fā)實(shí)戰(zhàn)視頻課程?★★★

          .NET Core實(shí)戰(zhàn)項(xiàng)目之CMS 第一章 入門篇-開篇及總體規(guī)劃

          【.NET Core微服務(wù)實(shí)戰(zhàn)-統(tǒng)一身份認(rèn)證】開篇及目錄索引

          Redis基本使用及百億數(shù)據(jù)量中的使用技巧分享(附視頻地址及觀看指南)

          .NET Core中的一個(gè)接口多種實(shí)現(xiàn)的依賴注入與動(dòng)態(tài)選擇看這篇就夠了

          10個(gè)小技巧助您寫出高性能的ASP.NET Core代碼

          用abp vNext快速開發(fā)Quartz.NET定時(shí)任務(wù)管理界面

          在ASP.NET Core中創(chuàng)建基于Quartz.NET托管服務(wù)輕松實(shí)現(xiàn)作業(yè)調(diào)度

          現(xiàn)身說法:實(shí)際業(yè)務(wù)出發(fā)分析百億數(shù)據(jù)量下的多表查詢優(yōu)化

          關(guān)于C#異步編程你應(yīng)該了解的幾點(diǎn)建議

          C#異步編程看這篇就夠了


          瀏覽 105
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美精品黄| 先锋av资源在线 先锋影音成人在线 | 影音先锋av中文字幕 | 奇米影视亚洲色图 | 久久三级电影网站 |