分佈式ID生成方案

分佈式ID生成方案(分佈式數據庫)

背景:在互聯網應用中,應用須要爲每個用戶分配一個id,在使用分佈式數據庫狀況下,已經不能依靠自增主鍵來生成惟一性id了。。。html

根據特定算法生成惟一ID

可重現的id生成方案:使用用戶提供的特定的數據源(登陸憑證),經過某種算法生成id,這個過程是可重現的,只要用戶提供的數據源是惟一的,那麼生成的id也是惟一的。

例如經過用戶註冊的email+salt,使用摘要算法(md5/sha)生成128bit的數據,而後經過混合因子轉變爲一個long類型的數據是64bit,有264 個可用數據,理論上衝突概率極低,優勢:可用保證id固定的,每次經過email登陸,直接能獲得id,不須要訪問數據庫查詢idjava

不可重現的方案:

使用每一個服務器環境中的以下參數:算法

1. 服務器網卡MAC地址/IP地址(確保服務器之間不衝突) 
2. 每一個生成ID的程序的惟一編號(確保同一服務器上的不一樣服務之間不衝突) 
3. 程序每次啓動的惟一編號(確保程序的每次啓停之間不衝突) 
4. 啓動後內存裏的序列號/系統當前時間(確保程序的一次運行期內不衝突)
數據庫

以及其餘的參數,混合生成id,保證多臺服務器、多個線程生成的id不衝突。數組

例如:服務器

UUID.randomUUID().toString() 生成的是length=3216進制格式的字符串,若是回退爲byte數組共16byte元素,即UUID是一個128bit長的數字,通常用16進製表示。算法的核心思想是結合機器的網卡、當地時間、一個隨即數來生成UUID。從理論上講,若是一臺機器每秒產生10000000GUID,則能夠保證(機率意義上)3240年不重複dom

例如:Instagram ID生成策略[翻譯]分佈式

http://www.cnblogs.com/yjl49/archive/2012/04/16/2452210.htmlui

Twitter的 Snowflake---一個使用Apache ZooKeeper來整合全部節點而後生成64bit惟一ID的簡潔的服務。java實現spa

http://www.zuidaima.com/code/file/896737710621696.htm?dir=/896737710621696.java

是由(時間+應用的workId+應用的內存的sequence)生成

隨機生成13位絕對無重複隨機數的高效方法--這個須要數據庫支持,會由於數據庫存在瓶頸

http://www.cnblogs.com/wenhuisun/archive/2011/12/22/2297490.html

相關文章
相關標籤/搜索