分布式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

相关文章
相关标签/搜索