在資料庫主鍵設計上,比較常見的方法是採用自增id(1開始,每次加1)和生成guid。
資料庫自增主鍵保證唯一性,但在分布式系統中,部署需要考慮的因素太多;guid設計簡單,能保證主鍵的唯一性,分布式系統中,資料庫部署也簡單,只是guid是一串無物理意義的字串,大量資料查詢的時候效率相對會打折,儲存暫用率也有些高。
snowflake演算法的好處有兩點:一是純數字,二是整體上來說是按時間順序的
參考:
粗糙的原理解釋:
大體上,取時間戳的有序遞增性得到不同的id;由於高併發的場景,毫秒級別已經不能滿足主鍵的唯一性(同一毫秒內插入多條資料是高併發系統中尋常需求)。因此加入機器碼和計數器;
首先有乙個元素儲存上乙個時間戳,每次生成主鍵會跟上乙個時間戳做對比,如果當前生成的時間戳比上乙個時間戳還要小,證明當前機器的系統時間有錯誤,丟擲異常。
如果當前時間比上乙個時間戳大,此時的邏輯最簡單了。很容易得到乙個唯一的主鍵,時間空間上唯一。那麼,經過雪花演算法後將會得到乙個固定長度的唯一主鍵,然後將計數器置零,把當前時間戳儲存為上一時間戳以待下次使用。
如果當前時間與上乙個時間是相等的,那麼就需要在毫秒級別內做序列號,啟動12位序列號,計數。再經過雪花演算法後得到乙個固定長度的唯一主鍵。
自增ID演算法snowflake 雪花
在資料庫主鍵設計上,比較常見的方法是採用自增id 1開始,每次加1 和生成guid。生成guid的方式雖然簡單,但是由於採用的是無意義的字串,推測會在資料量增大時造成訪問過慢,在基礎網際網路的系統設計中都不推薦採用。自增id的方法雖然比較適合大資料量的場景,當時由於自增id是按照順序增加的,資料記錄...
分布式自增ID演算法snowflake的JAVA實現
分布式系統中,有一些需要使用全域性唯一id的場景,這種時候為了防止id衝突可以使用36位的uuid,但是uuid有一些缺點,首先他相對比較長,另外uuid一般是無序的。有些時候我們希望能使用一種簡單一些的id,並且希望id能夠按照時間有序生成。而twitter的snowflake解決了這種需求,最初...
mysql 實現id自增序列 mysql自增id列
如果希望在每次插入新記錄時,自動地建立主鍵欄位的值。可以在表中建立乙個 auto increment 字段。mysql 使用 auto increment 關鍵字來執行 auto increment 任務。預設地auto increment 的開始值是 1,每條新記錄遞增 1。主鍵又稱主關鍵字,主關...