java并发生成编号_高并发生成订单号 - 新时代搬砖的个人空间 - OSCHINA - 中文开源技术交流社区...

本文探讨了在高并发环境下,如何使用Java生成16位不重复的订单号。提出了三种方案:基于时间戳和纳秒、会话ID的hashCode以及UUID的hashCode。最终推荐使用UUID的hashCode,结合机器ID,以保证在大规模并发下的唯一性。
摘要由CSDN通过智能技术生成

银联16位数字订单号

永远不重复的生成算法

请尊重知识,请尊重原创 更多资料参考请见  http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1

1、 前提背景

相信做过银联支付的都知道,银联的订单号要求商户提供一个不重复的16位数字订单号(不重复指的是对商户本身,不用考虑银联有多个商户会与其他商户的订单号重复)。16位数其实很短,要考虑每秒并发1w或者10w或100万时,重复订单号将数不过来。

需要考虑的因素:

 若使用数据库保存流水号,集群部署时,同步关键字不再有效。当然同步对性能也有非常大的影响;

 若使用时间,必须要精确到毫秒、微妙级别,长度就不止16位了。

 若使用数据库字段自增,数据库并发时硬件将吃不消。

 获取订单号时检查表的最大值,这种方案是最不可取的。

以下将给出本人经过深入研究的三种方案,按顺序,最优的方案为第三个。

备注:

如果要测试产生重复订单号的情况,可以建立一个表,把订单号字段设置为唯一性,然后开启1000或10000或更多的线程去请求方法,每个线程循环5次或10次来请求,在方法里面写插入语句。或者可以使用Apache的ab工具并发测试。

使用方法:ab -n5000 -c5000 http://192.168.1.102:8888/kjcx/aaa.action

2、 可选方案一

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值