一种生成流水号的方法

1.介绍

今天作了一个功能,生成订单流水号,固然这其实这并非一个很难的功能,最直接的方式就是日期+主机Id+随机字符串来拼接一个流水号。可是今天有个我认为比较优雅方式来实现。我要介绍是日期+ long(商家Id+订单类型+主机ID+AtomicInteger),什么意思呢,前面的日期保持不变,后面的将商家Id,订单的类型,主机的Id,AtomicInteger,经过移位与或运算“保存”到一个long类型里面。为何要这么作?java

  1. 不想把相关信息直接暴露出去。
  2. 经过流水号能够快速获得相关业务信息,快速定位问题。
  3. 使用AtomicInteger可提升并发量,下降了冲突。

2.原理解释

前面的生成日期就不须要讲了,直接讲解如何经过移位和与或操做获得long值。
先来看张图:git

image.png

这是一个我设计的long存储形式,你们能够格局自身业务来自行设计,什么业务数据占的位数。如今来详细解释下。github

  1. 符号位,这个不用过的介绍,你们都知道2进制第一位都是符号位,0表示正数1表示负数
  2. 当前秒数,表述的是当前是当天的第多少秒,天天最多有86400秒,最多占17位
  3. 商家Id占14位,因为业务涉及到商户,订单也是归为每一个商户下面的,假定咱们的最多有9999家商户,9999占位是14位,因此咱们商户Id占14位,你们根据自身业务的量来决定长度。
  4. 订单类型,假定咱们的订单类型还停留在10种之内,因此咱们保留4位,最多支持类型16种,你们一样的根据业务的量来决定
  5. 服务器的Id,假定服务器数量在10台之内,因此咱们保留4位,最多支持16台服务器,你们一样的根据自身服务器的数量来决定。,
  6. 剩下的24位所有留给AtomicInteger,设计上我这里的qps能够达到2的24方。这个其实已经很大了。你们根据上面的设计留下来的数量当AtomicInteger位数,其实能够知足大部分业务需求了。

介绍了具体的原理,如今要上代码了。服务器

3.show code

image.png

运行测试结果:并发

image.png

image.png

源代码:https://github.com/applenele/DeepJavaWeb/blob/master/javabasics/src/main/java/com/smallcode/utils/SerialNumberUtil.javaapp

相关文章
相关标签/搜索