一、简介
1.1 特性需求
(1)全局唯一
(2)支持高并发
(3)能够体现一定属性
(4)高可靠,容错单点故障
(5)高性能
二、唯一ID生成方案
2.1 UUID
这个东西是JAVA原生API提供的,它的确能保证唯一,但是有个弊端,它是一个字符串,字母数字组合,对于分布式系统中数据库主键的生成就不行了,数据库主键大家都是用整型类型来定义的,字母数字组合这种肯定不行了。
但是非数据库主键生成的场景倒是可以用用,必须消息唯一性这种,它是本地生成,没有远程调用,不存在网络时间,效率高;如果用它来建索引,效率是很低的。
2.2 独立的ID生成服务
这个应该比较多见,专门搭建一个系统用来给各个接入系统分配唯一ID,每个系统每次来请求的时候返回一段ID,系统拿到自己用,用完后,再来申请,再次分配下一区段的,以此类推。
这种方法,如果ID生成服务出现故障,那对其它所有系统来说都是灾难,可靠性要求太高了,性能效率方面倒是没有什么问题,区间分配,效率很高。
2.3 时间戳
直接取当前毫秒时间戳,效率高,也是整型数字,但是对并发量要求高的就不行了,无法保证唯一,1秒最多只能生成1000个嘛,因为是毫秒时间戳,小规模系统可以用用的,简单高效。
2.4 snowflake算法
这是twitter的一个id生成算法
Twitter-Snowflake算法产生的背景相当简单,为了满足Twitter每秒上万条消息的请求,每条消息都必须分配一条唯一的id,这些id还需要一些大致的顺序(方便客户端排序),并且在分布式系统中不同机器产生的id必须不同。
2.4 Redis生成ID
当使用数据库来生成ID性能不够要求的时候,我们可以尝试使用Redis来生成ID。这主要依赖于Redis是单线程的,所以也可以用生成全局唯一的ID。可以用Redis的原子操作INCR和INCRBY来实现。
2.5 Flicker的解决方案
因为MySQL本身支持auto_increment操作,很自然地,我们会想到借助这个特性来实现这个功能。
Flicker在解决全局ID生成方案里就采用了MySQL自增长ID的机制(auto_increment + replace into + MyISAM)。
2.5参考文献
https://blog.csdn.net/simonchi/article/details/56276878













网友评论