1. 程式人生 > 實用技巧 >snowflake雪花演算法生成全域性唯一的id

snowflake雪花演算法生成全域性唯一的id

常見的三種唯一id生成方式

1 UUID

常見的方式。可以利用資料庫也可以利用程式生成,一般來說全球唯一。

優點:

1)簡單,程式碼方便。

2)生成ID效能非常好,基本不會有效能問題。

3)全球唯一,在遇見資料遷移,系統資料合併,或者資料庫變更等情況下,可以從容應對。

缺點:

1)沒有排序,無法保證趨勢遞增。

2)UUID往往是使用字串儲存,查詢的效率比較低。

3)儲存空間比較大,如果是海量資料庫,就需要考慮儲存量的問題。

4)傳輸資料量大

5)不可讀。

2 Redis

當使用資料庫來生成ID效能不夠要求的時候,我們可以嘗試使用Redis來生成ID。這主要依賴於Redis是單執行緒的,所以也可以用生成全域性唯一的ID。可以用Redis的原子操作 INCR和INCRBY來實現。

優點:

1)不依賴於資料庫,靈活方便,且效能優於資料庫。

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

缺點:

1)如果系統中沒有Redis,還需要引入新的元件,增加系統複雜度。

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

3)網路傳輸造成效能下降。

3 開源演算法snowflake

snowflake是Twitter開源的分散式ID生成演算法,結果是一個long型的ID。其核心思想是:使用41bit作為毫秒數,10bit作為機器的ID(5個bit是資料中心,5個bit的機器ID),12bit作為毫秒內的流水號(意味著每個節點在每毫秒可以產生 4096 個 ID),最後還有一個符號位,永遠是0

快速入門

  snowflake是一個演算法,不是一個Jar,所以我們可以直接引入一個工具類放在公共模組中,工具類在商城第四天的資源裡 IdWorker.java

public class IdTest {
public static void main(String[] args) {
IdWorker idWorker = new IdWorker(1,1);
for (int i = 0; i < 1000; i++) {
long id = idWorker.nextId();
System.out.println(id);
}
}
}

實際運用

  在application.yml裡定義兩個變數(自己起名就可以)

#雪花演算法要使用的機器id和序列號範圍,這兩個名字是自己起的
workerId: 0
datacenterId: 0

  在引導類裡編寫一個bean

@Value("${workerId}")
private Integer workerId;
@Value("${datacenterId}")
private Integer datacenterId;

@Bean
public IdWorker idWorker(){
return new IdWorker(workerId,datacenterId);
}

  之後在需要生成id的地方注入這個bean即可


1