银联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、 可选方案一
本方案使用的是当前时间,包括毫秒数、纳秒数,不需要数据库参与计算,