• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >JSP > 全局唯一ID的生成方式(2)

全局唯一ID的生成方式(2)

作者:yucongyuqian的博客 字体:[增加 减小] 来源:互联网 时间:2017-08-07

yucongyuqian的博客通过本文主要向大家介绍了全局阈值算法等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

原版网址:http://blog.csdn.net/noliyo/article/details/10549377
一、程序直接生成:
使用jdk中的concurrent包可以轻松实现唯一数字型ID的生成,且无需考虑单例、采用高效率的CAS无需考虑synchronized关键字
[java] view plain copy
print?

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()方法可以得到如下代码
[java] view plain copy
print?

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只在某一段时间内有效过了时间之后需要重新回到起点循环等。
例如:时间戳+随机数;
[java] view plain copy
print?

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());  
    }  
}  

这个在性能上非常理想了,但是时间戳这个东西实在有些问题,能拿到到底精确到什么程度的时间戳,如果只能到毫秒一级还真是有些风险的,或许可以通过增加随机数的位数来降低重复的概率,但是仍然有重复的可能性,而且也难保系统时间会不会由于外部原因发生变化。不过对于请求量较小且可以容忍非常偶尔的重复率的场景,应该是个不错的选择。

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2017-05-11jdbc操作mysql数据库实例
  • 2017-05-11Java 通过设置Referer反盗链
  • 2017-05-11一个简单的JAVA字符集过滤器实现
  • 2017-12-08Spring.xml 标签配置补充
  • 2017-05-11JSP刷新页面表单重复提交问题解决办法分享
  • 2017-05-11JSP与Servlet的介绍说明
  • 2017-05-11jsp中利用jquery+ajax在前后台之间传递json格式参数
  • 2017-05-11J2SE中的序默认序列化
  • 2017-05-11jsp 连接sql server 2008 连接不上的解决方法
  • 2017-05-11多个jsp页面共享一个js对象的超级方法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 为Java应用程序添加退出事件响应
    • jsp ${param.id}用法
    • 如何使用JSP+MySQL创建留言本(二)
    • JDBCTM 指南:入门6-PreparedStatement
    • Hibernate通用数据库操作代码
    • 写一个对搜索引擎友好的文章SEO分页类
    • Spring 自动代理创建器详细介绍及简单实例
    • 【Tomcat】-- 小程序开发 tomcat 申请阿里云HTTPS配置
    • JSP针对XML文件操作技巧实例分析
    • jsp页面中如何将时间戳字符串格式化为时间标签

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有