基于.NET Standard的分布式自增ID算法--Snowflake
概述
本篇文章主要講述分布式ID生成算法中最出名的Snowflake算法。搞.NET開(kāi)發(fā)的,數(shù)據(jù)庫(kù)主鍵最常見(jiàn)的就是int類(lèi)型的自增主鍵和GUID類(lèi)型的uniqueidentifier。
那么為何還要引入snowflake呢?
INT自增主鍵
自增主鍵是解決主鍵生成的最簡(jiǎn)單方案,它有如下優(yōu)勢(shì):
數(shù)據(jù)庫(kù)本身負(fù)責(zé)主鍵生成,效率高
數(shù)據(jù)庫(kù)本身保證主鍵順序遞增,方便存儲(chǔ)和檢索
相對(duì)應(yīng)的,它也有如下缺點(diǎn):
嚴(yán)重依賴(lài)數(shù)據(jù)庫(kù)服務(wù)
強(qiáng)順序遞增,不易橫向擴(kuò)展
分庫(kù)分表很難處理
不方便導(dǎo)入數(shù)據(jù)
上層應(yīng)用在插入數(shù)據(jù)時(shí),如果需要獲知主鍵,必須再次查詢(xún)
總結(jié)來(lái)說(shuō),INT自增主鍵在單機(jī)性能和主鍵嚴(yán)格遞增上由很大的優(yōu)勢(shì),但是在擴(kuò)展性和分布式數(shù)據(jù)庫(kù)上有較大限制
GUID主鍵
GUID(全局唯一標(biāo)識(shí)符,Globally Unique Identifier)為128位(16字節(jié)),它使用太網(wǎng)卡地址、納秒級(jí)時(shí)間、芯片ID碼和許多可能的數(shù)字根據(jù)算法動(dòng)態(tài)生成,理論上可以有2^128個(gè)結(jié)果,
所以產(chǎn)生2個(gè)相同的ID的幾率非常小。
它的優(yōu)點(diǎn)如下:
應(yīng)用生成,解放服務(wù)器壓力
生成的ID可以做到全庫(kù)唯一,方便數(shù)據(jù)庫(kù)分庫(kù)分表、數(shù)據(jù)導(dǎo)入
缺點(diǎn)也很明顯:
16字節(jié)太長(zhǎng),浪費(fèi)空間
非順序遞增,增加數(shù)據(jù)庫(kù)存儲(chǔ)和檢索開(kāi)銷(xiāo)
在做數(shù)據(jù)庫(kù)主鍵選則時(shí),如果系統(tǒng)較小,業(yè)務(wù)邏輯相對(duì)簡(jiǎn)單,可以考慮使用自增主鍵;如果業(yè)務(wù)復(fù)雜,涉及到分庫(kù)分表分布式等,建議考慮GUID。如果認(rèn)為GUID的缺點(diǎn)太影響使用,
可以考慮馬上開(kāi)始重點(diǎn)介紹的分布式ID生成算法?Snowflake
Snowflake是由Twitter提出并首先使用的分布式ID生成算法,使用它來(lái)生成分布式趨勢(shì)遞增的Id。
分布式
Id有分布式系統(tǒng)的節(jié)點(diǎn)自己生成
趨勢(shì)遞增
主鍵非嚴(yán)格順序遞增的,而是根數(shù)時(shí)間順序遞增,這在一定程度上保證了數(shù)據(jù)存儲(chǔ)和索引的效率
算法講解
總長(zhǎng)度為64位長(zhǎng)整型(8字節(jié))
1位:首字節(jié)固定為0,來(lái)保證所有生成的數(shù)據(jù)都是正數(shù)
41位:第2到第42位工41字節(jié),用于生成毫秒級(jí)時(shí)間戳,計(jì)算大概(2^41?1)/(1000?60?60?24?365)=69 年,對(duì)于一般系統(tǒng)來(lái)說(shuō)絕對(duì)夠用。
10位: 第43位到第52位為工作機(jī)ID,可表示2^10=1024臺(tái)設(shè)備,一般高5位表示機(jī)房Id(datacenterId),低5位表示工作節(jié)點(diǎn)ID(workid)
12位:第53位到第64位表示序列號(hào),2^12-1=4095
綜上算法,表示單機(jī)每毫秒可以提供4095個(gè)Id,所有機(jī)器每毫秒可生成4095*1024=4194304個(gè)Id。
它的優(yōu)點(diǎn)如下:
應(yīng)用生成,解放服務(wù)器壓力
生成的ID可以做到全庫(kù)唯一,方便數(shù)據(jù)庫(kù)分庫(kù)分表、數(shù)據(jù)導(dǎo)入
8字節(jié),長(zhǎng)整型,節(jié)省空間
趨勢(shì)遞增,方便數(shù)據(jù)存儲(chǔ)和查詢(xún)
如何在.NET中實(shí)現(xiàn)該算法呢?下篇博客重點(diǎn)揭曉。
原文地址:https://www.cnblogs.com/leafly/p/10080774.html
.NET社區(qū)新聞,深度好文,歡迎訪問(wèn)公眾號(hào)文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的基于.NET Standard的分布式自增ID算法--Snowflake的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 用ABP入门DDD
- 下一篇: 领域驱动设计,让程序员心中有码(二)