高并发情况下如何保证订单号不重复

概述:

上家公司面试,面试官问我一个问题,如何保证服务器在5000dps的时候订单号不重复?

       当时前公司用的订单号还是32位的,用的方法是:UUID的16位随机数+截取时间戳的一部分+用户openId的一部分+随机数。我就凭借自己的经验回答了。面试官觉着没问题。

紧接着他问:如果订单号压缩16位的呢?

       当时我一下子还不知道怎么说。就说的是UUID的一部分加时间戳。

 

如何设计一个16位的不重复订单?

方案一、16位UUID

今天实验:在高并发的情况下,时间戳,进程ID,线程ID打印出来都是一样的,所以再用这三个东西就没必要了。

 时间戳:

线程id:

实验得出结果:用uuId的前面16位照样不会重复。

String uuid = UUID.randomUUID().toString().replace("-", "").substring(0, 16);

 

方案二、yyyyMMhh+8位自增序列

 前8位用yyyyMMhh,后8位用redis单线程的特性,使用redis的原子递增。缺少部分用0补齐。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值