概述:
上家公司面试,面试官问我一个问题,如何保证服务器在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补齐。