分布式ID生成方案(分布式数据库)
背景:在互联网应用中,应用需要为每一个用户分配一个id,在使用分布式数据库情况下,已经不能依靠自增主键来生成唯一性id了。。。
根据特定算法生成唯一ID
可重现的id生成方案:使用用户提供的特定的数据源(登录凭证),通过某种算法生成id,这个过程是可重现的,只要用户提供的数据源是唯一的,那么生成的id也是唯一的。
例如通过用户注册的email+salt,使用摘要算法(md5/sha)生成128bit的数据,然后通过混合因子转变为一个long类型的数据是64bit,有264 个可用数据,理论上冲突几率极低,优点:可用保证id固定的,每次通过email登录,直接能得到id,不需要访问数据库查询id。
不可重现的方案:
使用每个服务器环境中的如下参数:
1. 服务器网卡MAC地址/IP地址(确保服务器之间不冲突)
2. 每个生成ID的程序的唯一编号(确保同一服务器上的不同服务之间不冲突)
3. 程序每次启动的唯一编号(确保程序的每次启停之间不冲突)
4. 启动后内存里的序列号/系统当前时间(确保程序的一次运行期内不冲突)
以及其他的参数,混合生成id,保证多台服务器、多个线程生成的id不冲突。
例如:
UUID.randomUUID().toString() 生成的是length=32的16进制格式的字符串,如果回退为byte数组共16个byte元素,即UUID是一个128bit长的数字,一般用16进制表示。算法的核心思想是结合机器的网卡、当地时间、一个随即数来生成UUID。从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义上)3240年不重复
例如:Instagram 的ID生成策略[翻译]
http://www.cnblogs.com/yjl49/archive/2012/04/16/2452210.html
Twitter的 Snowflake---一个使用Apache ZooKeeper来整合所有节点然后生成64bit唯一ID的简洁的服务。java实现
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