参考:常用的分布式ID方案

快速查询设计

带业务含义的编号,可以用来进行快速查询设计

高并发下唯一订单号生成思考?

订单号3个性质:1.唯一性  2.不可推测性 3.效率性

可选方案一 
本方案使用的是当前时间,包括毫秒数、纳秒数,不需要数据库参与计算,性能不用说。

public static String genId(String machineId){String orderId =machineId +(System.currentTimeMillis() + "").substring(1) +(System.nanoTime() + "").substring(7, 10);System.out.println(orderId);return orderId;
}

讲解:
参数machineId:是集群时的机器代码,可以1-9任意。部署时,分别为部署的项目手动修改该值,以确保集群的多台机器在系统时间上不一致的问题(毫无疑问每台机器的毫秒数基本上不一致)。
参数System.currentTimeMillis():这是java里面的获取1970年到目前的毫秒数,是一个13位数的数字,与Date.getTime()函数的结果一样,比如1378049585093。经过研究,在2013年,前三位是137,在2023年是168,到2033年才199.所以,我决定第一位数字1可以去掉,不要占位置了。可以肯定绝大多数系统用不了10年20年。这样,参数2就变成了12位数的数字,加上参数1machineId才13位数。
参数System.nanoTime():这是java里面的取纳秒数,经过深入研究,在同一毫秒内,位置7,8,9这三个数字是会变化的。所以决定截取这三个数字出来拼接成一个16位数的订单号。
总结:理论上此方案在同一秒内,可以应对1000*1000个订单号,但是经过测试,在每秒并发2000的时候,还是会出现2-10个重复。

可选方案二
本方案基于UUID。
UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的,这个不重复性全世界人民都知道。当然,既然字符串值不重复,那对应的hashCode也是一样,不会重复。
算法:

Java代码  
  1. OrderId=
  2. machineId+
  3. UUID.randomUUID().toString().hashCode();

讲解:
参数1不再解释。
参数2是值生成UUID然后取它的hashCode值,经过测试,完全没有一点问题。您可以开1000w的并发去测试插入吧,只要数据库不会报唯一性错误,那就没问题。
总结:
hashCode这个算法从搞软件开始到现在这么多年,一直没派上用场,这次大大的用上了。解决了问题。请同志们以后善用这个东西。
5、 附录:方案二的算法代码

public static String getOrderIdByUUId(String machineId) {int hashCodeV = UUID.randomUUID().toString().hashCode();if (hashCodeV < 0) {//有可能是负数hashCodeV = -hashCodeV;}// 0 代表前面补充0// 4 代表长度为4// d 代表参数为正数型String orderId=machineId + String.format("%015d", hashCodeV);System.out.println(orderId);return orderId;
}

方案二其实也就一个函数,很简便。缺点:无序性。

方案三、Snowflake

64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加))

高并发下唯一订单号生成器【16位数字订单号】相关推荐

  1. 16位的数字高字节和低字节_显示掩盖较低和较高的16位数字半字节| 8086微处理器...

    16位的数字高字节和低字节 Problem: To show masking of lower and higher nibbles of 16bit number using 8086 Microp ...

  2. 根据省份证号前6位数字生成的三级联动下拉菜单

    <Script language="JavaScript"> // 定义一级数组 var D0=new Array('("北京市","11 ...

  3. shell两个数字相乘_使用8086微处理器将两个16位数字相乘而不带进位

    shell两个数字相乘 Problem statement: 问题陈述: To perform multiplication operation between 2 16bit numbers wit ...

  4. 数字图像处理图像反转的实现_使用8086微处理器反转16位数字

    数字图像处理图像反转的实现 Problem statement: 问题陈述: Write an assembly language program in 8086 microprocessor to ...

  5. sql 数字减去null_减去两个16位数字| 8086微处理器

    sql 数字减去null Problem: Write a program to subtract two 16-bit numbers where starting address is 2000 ...

  6. 当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,因为并不是一个随便的信用卡号码都是合法的,它必须通过Luhn算法来验证通过。 该校验的过程:1、从卡号最后一位数字开始,逆

    import java.util.Scanner;/*** 当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,* 因为并不是一个随便的信用卡号码都是合法的,它必须通过Luh ...

  7. 实现幸运抽奖——会员号的百位数字等于产生的随机数字即为幸运会员,

    Public static void main (String[ ]args{ //键盘录入 Scanner input = new Scanner(System.in); system.out.pr ...

  8. # 将微博地址里面的62进制字符串转换成10进制的16位数字mid

    # 将微博地址里面的62进制字符串转换成10进制的16位数字middef base62_decode(string):alphabet = "0123456789abcdefghijklmn ...

  9. 16位的数字高字节和低字节_显示8位数字的较低和较高半字节的掩蔽| 8086微处理器...

    16位的数字高字节和低字节 Problem: To show masking of lower and higher nibbles of 8-bit number using 8086 Microp ...

最新文章

  1. OSChina 周二乱弹 —— 这简直是对佛祖的DDoS攻击啊
  2. 函数栈帧的创建和销毁图解
  3. git push 失败出现error: src refspec master does not match any.解决方案
  4. websocket没准备好如何解决_惠普打印机打印没反应如何解决 惠普打印机打印没反应解决方法【详解】...
  5. IIR滤波器的FPGA实现
  6. 堪比熊猫烧香!中国新型蠕虫病毒大爆发!电脑瞬间报废
  7. 外网无法访问nginx服务器默认端口问题解决
  8. html怎么添加样式,HTML添加样式三种办法
  9. 20162327WJH四则运算第二周总结
  10. 通宵写6000字,浅谈密码的破解(破解HASH算法加密)
  11. OpenPose: Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields
  12. 大数据开发之Sqoop详细介绍
  13. 计算机考研代码854,哈工大计算机考研考纲854计算机基础
  14. 2017-09-27 ~ 2017-10-02 稻城亚丁旅行笔记
  15. java后端和web_从java和web角度分析前端好还是后端好
  16. 网页中通过js修改img的src属性刷新图片时,图片缓存问题现象表述及问题解决
  17. mysql 统计 打卡数据_根据考勤机数据,有重复打卡,统计上班天数的简单办法(文末送书)...
  18. Python爬虫学习第三章-4.3-使用xpath解析爬取全国城市名称
  19. 多个div在一个div中一行水平显示(float)
  20. iOS开发夜间模式的设置(主题切换)

热门文章

  1. 激光雕刻机、激光切割机、激光焊接机测试,激光打标机测试认证
  2. Oracle11g以上版本如何打开企业管理器
  3. 第一届BMZCTF公开赛-MISC-Writeup
  4. 宽搜——nkoj1168血色十字军
  5. WebService与CXF
  6. Java开发6年,年近30,半失业状态,互联网裁员潮还是逃不掉吗?
  7. 进取型人格分析,进取型人格的职业规划
  8. 【杂谈】随便聊点啥20201014
  9. 院士:科研工作者也得养家!非升即走压力下,不得不做短平快的研究
  10. Excel系列:if、mathc、choose条件判断语法的使用