在數據庫主鍵設計上,比較常見的方法是采用自增ID(1開始,每次加1)和生成GUID。
數據庫自增主鍵保證唯一性,但在分布式系統中,部署需要考慮的因素太多;GUID設計簡單,能保證主鍵的唯一性,分布式系統中,數據庫部署也簡單,只是GUID是一串無物理意義的字符串,大量數據查詢的時候效率相對會打折,存儲暫用率也有些高。
snowflake算法的好處有兩點:一是純數字,二是整體上來說是按時間順序的
參考:https://www.cnblogs.com/lilunjia/p/7109739.html
粗糙的原理解釋:
大體上,取時間戳的有序遞增性得到不同的id;由於高並發的場景,毫秒級別已經不能滿足主鍵的唯一性(同一毫秒內插入多條數據是高並發系統中尋常需求)。因此加入機器碼和計數器;
首先有一個元素存儲上一個時間戳,每次生成主鍵會跟上一個時間戳做對比,如果當前生成的時間戳比上一個時間戳還要小,證明當前機器的系統時間有錯誤,拋出異常。
如果當前時間比上一個時間戳大,此時的邏輯最簡單了。很容易得到一個唯一的主鍵,時間空間上唯一。那么,經過雪花算法后將會得到一個固定長度的唯一主鍵,然后將計數器置零,把當前時間戳保存為上一時間戳以待下次使用。
如果當前時間與上一個時間是相等的,那么就需要在毫秒級別內做序列號,啟動12位序列號,計數。再經過雪花算法后得到一個固定長度的唯一主鍵。