分布式ID生成方案

在分布式数据库环境中,自增主键无法满足唯一ID生成需求。本文探讨了两种方案:可重现的ID生成,利用用户数据源如email+salt通过摘要算法生成;不可重现的ID生成,结合服务器环境参数如MAC地址、程序编号等确保多服务器、多线程不冲突。还提及了UUID、Instagram和Twitter的ID生成策略。
摘要由CSDN通过智能技术生成

分布式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=3216进制格式的字符串,如果回退为byte数组共16byte元素,即UUID是一个128bit长的数字,一般用16进制表示。算法的核心思想是结合机器的网卡、当地时间、一个随即数来生成UUID。从理论上讲,如果一台机器每秒产生10000000GUID,则可以保证(概率意义上)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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值