美文网首页
java专题之唯一ID

java专题之唯一ID

作者: 这一刻_776b | 来源:发表于2019-12-30 16:16 被阅读0次

一、简介

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

相关文章

网友评论

      本文标题:java专题之唯一ID

      本文链接:https://www.haomeiwen.com/subject/buemoctx.html