分布式多個機器生成id,如何保證不重復?

1.snowflake方案:

snowflake是Twitter開源的分布式ID生成算法,結(jié)果是一個long型的ID(64位)。其核心思想是:使用41bit作為毫秒數(shù),10bit作為機器的ID(5個bit是數(shù)據(jù)中心,5個bit的機器ID),12bit作為毫秒內(nèi)的流水號(意味著每個節(jié)點在每毫秒可以產(chǎn)生 4096 個 ID),最后還有一個符號位,永遠是0。

優(yōu)點:

1.毫秒數(shù)在高位,自增序列在低位,整個ID都是趨勢遞增的。

2.不依賴數(shù)據(jù)庫等第三方系統(tǒng),以服務(wù)的方式部署,穩(wěn)定性更高,生成ID的性能也是非常高的。

3.可以根據(jù)自身業(yè)務(wù)特性分配bit位,非常靈活。

缺點:

強依賴機器時鐘,如果機器上時鐘回撥,會導致發(fā)號重復或者服務(wù)會處于不可用狀態(tài)。

2.用Redis生成ID:

因為Redis是單線程的,也可以用來生成全局唯一ID??梢杂肦edis的原子操作INCR和INCRBY來實現(xiàn)。

此外,可以使用Redis集群來獲取更高的吞吐量。假如一個集群中有5臺Redis,可以初始化每臺Redis的值分別是1,2,3,4,5,步長都是5,各Redis生成的ID如下:

A:1,6,11,16

B:2,7,12,17

C:3,8,13,18

D:4,9,14,19

E:5,10,15,20

這種方式是負載到哪臺機器提前定好,未來很難做修改。3~5臺服務(wù)器基本能夠滿足需求,都可以獲得不同的ID,但步長和初始值一定需要事先確定,使用Redis集群也可以解決單點故障問題。

另外,比較適合使用Redis來生成每天從0開始的流水號,如訂單號=日期+當日自增長號。可以每天在Redis中生成一個Key,使用INCR進行累加。

優(yōu)點:

1)不依賴于數(shù)據(jù)庫,靈活方便,且性能優(yōu)于數(shù)據(jù)庫。

2)數(shù)字ID天然排序,對分頁或需要排序的結(jié)果很有幫助。

缺點:

1)如果系統(tǒng)中沒有Redis,需要引入新的組件,增加系統(tǒng)復雜度。

2)需要編碼和配置的工作量較大。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容