唯一ID生成器snowflake

2021-10-01 12:35:04 字數 1181 閱讀 8880

/ˈsnəʊfleɪk/

很多場景需要使用全域性唯一id,用來標識唯一一條訊息,唯一一筆交易,唯一乙個使用者,唯一一張等等。

傳統資料庫表的自增主鍵是很簡單的一種實現方式,前提是你沒有分庫,也沒有分表,如果你分表了,id就會重複,失去唯一性:

用時間做唯一id,這個在併發比較高或者分布式環境中基本不可行,統一時間生成的id是重複的,不滿足全域性唯一
依然利用資料庫產生自增id,保證唯一性,和開頭提到的不同之處是,單獨使用一張(或固定幾張)資料庫表專門用來產生自增id,與業務無關,後續不再重新分表,資料量大時,可以刪除早一些時候產生的資料。

這樣做的好處是,實現簡單,容易理解。

不好的地方是,嚴重依賴資料庫,id產生速率受資料庫效能以及連線資料庫的網路影響。

好處:實現簡單,容易理解。

壞處:依賴redis,且redis需要持久化。

好處:使用非常簡單,不需要依賴其他設施。

壞處:太長,128bit,不適合做資料庫主鍵。

通常情況下,用時間來表示是最簡單的,如果同一時間(毫秒)有很多請求進來怎麼辦?

時間戳後面拼接上乙個數字,這個數字可以通過鎖控制每次遞增,每毫秒清零,重新開始遞增。

即便這樣,只是解決了單機的問題,如果是分布式環境,不同的機器,還是可能產生一樣的id的,這怎麼解決?

在上述時間戳和數字的基礎上在拼接上機器的id,這樣就不會重複了。

不同的資料中心,機器id是可能重複的,怎麼搞?

再拼接上資料中心的id就行了。

不同的星球上。。。

思想樸實無華,但是大道至簡。

最終產生的id是這個樣子的,時間戳,工作機器id,序列號可以根據實際需要調整長度(通常情況下不需要調整,完全夠用),總體64bit就行:

,時間戳,工作機器id,序列號可以根據實際需要調整長度(通常情況下不需要調整,完全夠用),總體64bit就行:

Java 唯一ID生成器

前段時間,寫了乙個id 生成器,發在群裡,結果遭到別人嘲笑,心有不甘,於是思來想去,決定在重新寫乙個id生成器。此方法生成的id理論上也是會有重複,但是這個概率太低太低,低到可以忽略不計。使用當前時間戳 指定長度的隨機數,並隨機打亂字串。可以生成指定長度的純數字的id。普通 id生成器 用時間戳生成...

IdGenerator 唯一Id生成器

public class idgenerator public idgenerator long processid this.processid processid protected long timegen public synchronized long nextid 剛剛生成的時間戳跟上次...

分布式唯一ID生成器

在應用程式中,經常需要全域性唯一的id作為資料庫主鍵。如何生成全域性唯一id?首先,需要確定全域性唯一id是整型還是字串?如果是字串,那麼現有的uuid就完全滿足需求,不需要額外的工作。缺點是字串作為id占用空間大,索引效率比整型低。如果採用整型作為id,那麼首先排除掉32位int型別,因為範圍太小...