生成UUID,python uuid生成
全球唯一标识符订单单号生成器/** 订单号生成(新)**/
私有静态最终原子积分SEQ=新原子整数(1000);
私有静态最终日期时间格式化程序DF _ FMT _前缀=日期时间格式化程序。的模式(" yymmdd hhmmsss ");
私有静态ZoneId ZONE _ ID=ZoneId。(“亚洲/上海");
公共静态字符串generateOrderNo(){
本地日期时间数据时间=本地日期时间。现在(ZONE _ ID);
if(SEQ.intValue()9990){
序列。getandset(1000);
}
返回数据时间。格式(DF _ FMT _前缀)以下。getandincrement();
}
public static void main(String[]args){ ListString orderNos=collections。同步列表(new ArrayList String());IntStream.range(0,8000).平行()。forEach(I-{ ordernos。add(generateOrderNo());});列表字符串过滤器ordernos=ordernos。流().独特()。收藏(收藏者。to list());System.out.println(生成订单数:订单号。size());System.out.println(过滤重复后订单数: filterordernos。size());System.out.println(重复订单数:(订单号size()-filterordernos。size());} 我们的应用是跑在码头工人里面,而且每个码头工人容器内的应用端口都一样,不过网路互联网协议(互联网协议)不会存在重复的问题,至于进程也有存在重复的可能,对于全球唯一标识符的方式之前吃过亏,总之吧,redis或分贝也算是一种比较好的方式,不过独立性较差。
同时还有一个因素也很重要,就是所有涉及到订单号生成的应用都是在同一台宿主机(linux实体服务器)上,所以就目前的系统架构我选用了互联网协议(互联网协议)的方式。
导入org。阿帕奇。公地。郎3。随机效用;
导入Java。网。inet地址;
导入Java。时间。本地日期时间;
导入Java。时间。zoneid
导入Java。时间。格式。日期时间格式化程序;
导入Java。util。ArrayList
导入Java。util。收藏;
导入Java。util。列表;
导入Java。util。并发。原子的。原子整数;
导入Java。util。溪流。收藏家;
导入Java。util。溪流。int流;
公共类订单生成2测试{
/** 订单号生成* */私有静态ZoneId ZONE _ ID=ZoneId。of(亚洲/上海);私有静态最终原子积分SEQ=新原子整数(1000);私有静态最终日期时间格式化程序DF _ FMT _前缀=日期时间格式化程序。模式的( yymmdd hhmmsss );公共静态字符串generateOrderNo(){本地日期时间数据时间=本地日期时间。现在(ZONE _ ID);如果(顺序。int value()9990){ seq。getandset(1000);}返回数据时间。格式(DF _ FMT _前缀)getLocalIpSuffix()seq。getandincrement();}私有易失性静态字符串IP后缀=空私有静态字符串getLocalIpSuffix (){ if(null!=IP_SUFFIX){返回IP _ SUFFIX}尝试{ synchronized(订单gen 2测试。class){ if(null!=IP_SUFFIX){返回IP _ SUFFIX} inet地址addr=inet地址。get localhost();//172.17.0.4 172.17.0.199,字符串主机地址=addr。gethostaddress();if (null!=主机地址。length()4){ String ipSuffix=主机地址。修剪().拆分( \\ . )[3];if(ipSuffix。length()==2){ IP _ SUFFIX=ipSuffix;返回IP _ SUFFIX } ipSuffix= 0 ipSuffix IP _ SUFFIX=ipSuffix。子串(ipsuffix。长度()-2);返回IP _ SUFFIX } IP _ SUFFIX=randomutils。nextint(10,20)" ";返回IP _ SUFFIX} } catch(异常e){ system。出去。println(获取互联网协议(互联网协议)失败: e . getmessage());IP _ SUFFIX=randomutils。nextint(10,20)" ";返回IP _ SUFFIX } } public static void main(String[]args){ list String orderNos=collections。同步列表(new ArrayList String());IntStream.range(0,8000).平行()。forEach(I-{ ordernos。add(generateOrderNo());});列表字符串过滤器ordernos=ordernos。流().独特()。收藏(收藏者。to list());System.out.println(订单样例:订单号。get(22));System.out.println(生成订单数:订单号。size());System.out.println(过滤重复后订单数: filterordernos。size());System.out.println(重复订单数:(订单号size()-filterordernos。size());} }
代码说明及几点建议
generateOrderNo()方法内不需要加锁,因为无锁的线程安全整数内使用的是国际体育仲裁法庭自旋转锁(保证可见性的同时也保证原子性,具体的请自行了解)
getLocalIpSuffix()方法内不需要对不为空的逻辑加同步锁(双向校验锁,整体是一种安全的单例模式)
本人实现的方式并不是解决问题的唯一方式,具体解决问题需要视当前系统架构具体而论
任何测试都是必要的,我同事在前几次尝试解决这个问题后都没有自测,不测试有损开发专业性!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。