1.數據庫自增主鍵
優點:簡單;唯一;遞增;增幅固定
缺點:寫性能決定每秒生成數量上限,擴展差;分佈式數據庫,主節點掛掉,備節點上時可能有問題(主節點寫入成功,日誌未同步到備節點,導致id重複)
備註:可有一個寫庫變成多個庫同時寫,如1、2、3三個庫同時寫,初始id分別爲1、2、3,自增幅度都爲3。這種方式可保證id不重複。但導致id不是絕對遞增,而是整體趨勢上遞增;其次是寫入的壓力仍然很大,mysql容易成爲性能瓶頸。
2.數據庫批量生成id
優點:效率高;降低數據庫壓力
缺點:需考慮安全性問題,防止取到重複id;如果業務需求是每次只生成一個id,性能有問題
備註:利用數據庫,初始化一行數據,初始值爲1,取10個id,就給該值加10,調用端取返回id值的前10個數值。以上即爲批量生成id思路。
3.UUID
優點:本地生成;效率高
缺點:UUID字符串過長,且無實際意義;無法保證遞增趨勢;建立的索引查詢效率低
4.當前時間毫秒與微秒
優點:本地生成;延時低;索引性能高
缺點:1秒內請求過1000後id肯定重複,微秒同理
5.zookeeper生成id
利用zookeeper增加版本號的方式是其中一種。建立節點,每次使節點版本加1。
優點:利用zk集羣解決單點問題
缺點:性能不高;id有上限,提供32位id;需要zk服務
備註:具體代碼見 http://blog.csdn.net/gongzi2311/article/details/58144091
6.snowflake算法
twitter開源分佈式生成id算法。
優點:基本解決了所有問題
缺點:每個節點時間可能不同,生成id是整體趨勢遞增的
備註:具體代碼見 http://blog.csdn.net/gongzi2311/article/details/58189306