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)需要編碼和配置的工作量較大。