幾乎所有的業務系統,都存在生成惟一id的需求,例如:
使用者id:user_id
訂單id: order_id
訊息id: msg_id
常見的id生成有三大類方法:
一、中介軟體實現
1、利用mysql的auto_increment,oracle的sequence實現
優點:簡單,遞增
缺點:伸縮性、擴充套件性差
2、利用redis的incr實現
優缺點:同方法1,但由於redis是記憶體操作,效能較方法1好 (需考慮redis序列化配置與效能之間的取捨權衡)
3、利用其它中介軟體實現
二、獨立的id生成服務
4、批量id生成服務
方法1之所以效能不高,是因為每次生成id都需要訪問資料庫,所以資料庫的壓力大。可以考慮每次從資料庫裡取一批id,快取到本地,用完一批之後再訪問資料庫取下一批,即批量id生成服務。
優點:效能較方法1大幅提高,資料庫壓力大大降低
缺點:服務重啟後會出現id」空洞」,另一方面,為了實現惟一id需求,引入獨立的服務,使系統複雜性提高
5、其它的服務**+中介軟體實現獨立的id生成服務
一般來說:服務**可以單獨部署,業務系統通過rpc或http方式呼叫它。也可以服務**與業務系統部署在一起,業務系統通過程序內的方法呼叫來呼叫它。
三、本地id生成演算法
6、uuid
優點:無限擴充套件
缺點:太長 ,無序,對b-tree索引字段,索引成本過高
7、snowflake演算法
核心思想為乙個long型的id:
總結:id生成演算法常見做法無非三類:利用中介軟體,id生成服務,本地id生成演算法。利用中介軟體一般又分為利用資料庫、redis和其它中介軟體實現;獨立的id生成服務通常是少量**+中介軟體實現,而服務既可以單獨部署,也可以隨業務系統共同部署;本地id生成演算法,以snowflake演算法作為參考,可以實現自定義的id生成演算法。
唯一ID的生成方法
生成唯一id的幾種方案 1 uuid 2 mysql的自增主鍵 3 mysql多例項自增主鍵 4 雪花id snowflake演算法 配合專案啟動命令效果更佳 5 redis生成方案 1.uuid生成方案 優點 實現簡單,本機生成,沒有什麼效能問題,況且是全球唯一的id,所以遷移資料的時候比較容易 ...
細聊分布式ID生成方法
幾乎所有的業務系統,都有生成乙個記錄標識的需求,例如 訊息標識 message id 訂單標識 order id 帖子標識 tiezi id 這個記錄標識往往就是資料庫中的唯一主鍵,資料庫上會建立聚集索引 cluster index 即在物理儲存上以這個字段排序。這個記錄標識上的查詢,往往又有分頁或...
Zookeeper全域性唯一ID生成方案解析
系統唯一id生成分案有很多種,例如 資料庫 auto increment,uuid,redis生成id redis原子操作incr和incrby twiitter的snowflake演算法,zookeeper生成id,mongodb的objectid,下面我們就看一下zookeeper實現分布式系統...