一、程序直接生成:
使用jdk中的concurrent包可以轻松实现唯一数字型ID的生成,且无需考虑单例、采用高效率的CAS无需考虑synchronized关键字

import java.util.concurrent.atomic.AtomicLong;

public class UniqueID {
private static AtomicLong uniqeid = new AtomicLong(0); public static long getNextID() {
return uniqeid.getAndIncrement();
} public static void main(String[] agrs) {
System.out.println(getNextID());
}
}
缺点:
1、基于内存,如果服务器重启则id会重新从0开始;
2、无法解决分布式的问题:基于单虚拟机,如果多虚拟机的话也有问题;
3、如果ID过于庞大,可能会导致溢出

二、借助第三方资源:数据库或者memcache
比如可以借助Oracle的SEQUENSE或者mysql的AUTO_INCREMENT来实现数字型ID的自增序列
优点:
1、有效的解决了分布式的问题
2、做好了持久化,解决了重启或者服务器挂掉导致的ID丢失问题
缺点:
1、每次获取都需要查询数据库,如果这个极为频繁的话会有性能上的瓶颈
2、数字型ID,可能溢出,不过这个最大值已经非常庞大,基本可以忽略
这个方法还可以延伸为使用memcache来充当数据库的角色,而且memcache天生支持CAS操作,效率上应该比数据库要好,但是牺牲了它的第二个优点,无法持久化


三、使用UUID:由jdk或借助第三方来提供
JDK的UUID提供了生成128位唯一ID(如“055b158a-e0ad-43f3-b2cd-702e31219191”)的接口,使用其伪随机的randomUUID()方法可以得到如下代码
import java.util.UUID;

public class JdkUUIDUniqueValue {
public static String getNextID() {
return UUID.randomUUID().toString();
} public static void main(String[] args) {
System.out.println(getNextID());
}
}
也可以由以下几种方式来完成这项工作:
mysql的uuid()函数:select uuid();
oracle的内置函数:select sys_guid() from dual;
hibernate也有uuid的实现方式
优点:
1、完全无状态,无需任何的同步,无需任何的持久化,分布式也无妨
缺点:
1、在理论上仍然有重复的可能性,虽然这种可能性极小
2、ID以长字符串的形式出现,可读性差,且需要更多的存储,在排序等相关操作中需要更多的资源

四、使用服务器系统时间、随机数、其他已知元素作为因子进行组合
这种情况一般都是为了考虑效率问题,既不想使用第三方资源,也不想使用uuid这么长的无意义字符串,或者还有其他特殊需求,比如必须是多少位的数字,再比如这个ID只在某一段时间内有效过了时间之后需要重新回到起点循环等。
例如:时间戳+随机数;

import java.util.Date;
import java.util.Random; public class MyUniqueID {
private static long getUniqueId() {
long cur = new Date().getTime();
int random = new Random().nextInt(1000000);
return Long.valueOf(cur + random);
} public static void main(String[] args) {
System.out.println(getUniqueId());
}
}
这个在性能上非常理想了,但是时间戳这个东西实在有些问题,能拿到到底精确到什么程度的时间戳,如果只能到毫秒一级还真是有些风险的,或许可以通过增加随机数的位数来降低重复的概率,但是仍然有重复的可能性,而且也难保系统时间会不会由于外部原因发生变化。不过对于请求量较小且可以容忍非常偶尔的重复率的场景,应该是个不错的选择。


全局唯一ID的生成方式的更多相关文章

  1. 高并发分布式环境中获取全局唯一ID[分布式数据库全局唯一主键生成]

    需求说明 在过去单机系统中,生成唯一ID比较简单,可以使用MySQL的自增主键或者Oracle中的sequence, 在现在的大型高并发分布式系统中,以上策略就会有问题了,因为不同的数据库会部署到不同 ...

  2. 如何在高并发分布式系统中生成全局唯一Id

    月整理出来,有兴趣的园友可以关注下我的博客. 分享原由,最近公司用到,并且在找最合适的方案,希望大家多参与讨论和提出新方案.我和我的小伙伴们也讨论了这个主题,我受益匪浅啊…… 博文示例: 1.     ...

  3. 高并发分布式系统中生成全局唯一Id汇总

    数据在分片时,典型的是分库分表,就有一个全局ID生成的问题.单纯的生成全局ID并不是什么难题,但是生成的ID通常要满足分片的一些要求:   1 不能有单点故障.   2 以时间为序,或者ID里包含时间 ...

  4. 全局唯一ID发号器的几个思路

    标识(ID / Identifier)是无处不在的,生成标识的主体是人,那么它就是一个命名过程,如果是计算机,那么它就是一个生成过程.如何保证分布式系统下,并行生成标识的唯一与标识的命名空间有着密不可 ...

  5. 雪花算法生成全局唯一ID

    系统中某些场景少不了全局唯一ID的使用,来保证数据的唯一性.除了通过数据库自带的自增id来保证 id 的唯一性,通常为了保证的数据的可移植性会选择通过程序生成全局唯一 id.百度了不少php相关的生成 ...

  6. 分布式全局唯一ID的实现

    分布式全局唯一ID的实现 前言 上周末考完试,这周正好把工作整理整理,然后也把之前的一些素材,整理一番,也当自己再学习一番. 一方面正好最近看到几篇这方面的文章,另一方面也是正好工作上有所涉及,所以决 ...

  7. 全局唯一ID设计

    在分布式系统中,经常需要使用全局唯一ID查找对应的数据.产生这种ID需要保证系统全局唯一,而且要高性能以及占用相对较少的空间. 全局唯一ID在数据库中一般会被设成主键,这样为了保证数据插入时索引的快速 ...

  8. 关于全局唯一ID生成方法

    引:最近业务开发过程中需要涉及到全局唯一ID生成.之前零零总总的收集过一些相关资料,特此整理以便后用 本博客已经迁移至:http://cenalulu.github.io/ 本篇博文已经迁移,阅读全文 ...

  9. 如何在高并发分布式系统中生成全局唯一Id(转)

    http://www.cnblogs.com/heyuquan/p/global-guid-identity-maxId.html 又一个多月没冒泡了,其实最近学了些东西,但是没有安排时间整理成博文, ...

随机推荐

  1. poj 3026 Borg Maze (最小生成树+bfs)

    有几个错误,调试了几个小时,样例过后 1Y. 题目:http://poj.org/problem?id=3026 题意:就是让求A们和S的最小生成树 先用bfs找每两点的距离,再建树.没剪枝 63MS ...

  2. hdu 1412 (STL list)

    简单例题 题目:http://acm.hdu.edu.cn/showproblem.php?pid=1412 list 相关博客:http://www.cnblogs.com/fangyukuan/a ...

  3. Access增删改查 (持续更新中)

    关于Access数据库(2003)的增删改查,其实和Sql大体差不多,但是还有很多不一样的地方.下面列几个容易犯的错误:  1.Access数据库的位置: conn = new OleDbConnec ...

  4. erlang mnesia 数据库实现SQL查询

    Mnesia是一个分布式数据库管理系统,适合于电信和其它需要持续运行和具备软实时特性的Erlang应用,越来越受关注和使用,但是目前Mnesia资料却不多,很多都只有官方的用户指南.下面的内容将着重说 ...

  5. 研究一家公司 z

    第一部分:确定一家公司的“质地”(描绘一家公司的总体印象)              1.1 天花板       天花板是指企业或行业的产品(或服务)趋于饱和.达到或接近供大于求的状态.在进行投资之前 ...

  6. 动态调用WebService 通用方法Moss 中 传统开发中都可用。

    WebService是啥大家都知道了,这里不做过多的解释.通常我们使用WebService的做法基本都是在我们的项目中添加Web引用的方式,首先找到WebService的地址,然后定义命名空间,这样会 ...

  7. leetcode@ [211] Add and Search Word - Data structure design

    https://leetcode.com/problems/add-and-search-word-data-structure-design/ 本题是在Trie树进行dfs+backtracking ...

  8. BNUOJ-29357 Bread Sorting 模拟

    题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=29357 直接模拟就可以了.. //STATUS:C++_AC_190MS_1884KB # ...

  9. Base64 报错 的解决办法 (Base-64 字符数组或字符串的长度无效。, 输入的不是有效的 Base-64 字符串,因为它包含非 Base-64 字符、两个以上的填充字符,或者填充字符间包含非法字符。)

    Base64 报错 的解决办法, 报错如下:1. FormatException: The input is not a valid Base-64 string as it contains a n ...

  10. [C++]VS2010功能设置

    VS2010快捷键设置 工具->选项->环境->键盘->[显示命令包含] 下面输入“对齐”关键字->窗口显示关于“对齐”的所有操作命令->选中“某一个”->[ ...