generate-order_sn


生成订单号的几点思考

summary:

  • 解决的场景是:
    当订单系统并发量足够大的时候, 基于 订单号(order_sn)是先生成后写入库 的事实, 需要能够满足系统生成的订单不会重复. 当出现重复订单号的时候, 需要如何处理.
  • 该文章抛砖引玉, 提到的思路可以借鉴.归纳几个点:
    • 讨论的一个限制条件是订单号长度为16byte, 订单号大致能够反应出订单的生成时间(即: 可以看出年月日时分秒)
    • 订单生成时间 + 随机数 # 思路: (随机数)来降低 同一瞬间(订单生成时间) 生成的订单 的重复率
    • 压缩订单生成时间 扩展随机数 # 思路: 压缩订单生成时间所占用的位数, 扩展随机数的位数
    • 倒转高位低位 # 扩展思路: 高位为随机数, 低位为时间. 高位可以表示的范围较大
    • 10进制 混和 16进制 # 扩展思路: 进制基数越大占用位数越小, 留给的随机数位数则越大
    • 耗时 # 限制条件: 最求最佳的性价比, 消耗最小的计算机资源来完成
    • test: 10 + 26 + 26 = 62, 62^15 - 62^11 ~ 678909652912205984715540480[共27位, 4位随机数, 62进制], 62^15 - 62^7 ~ 768909704948763146938028160[共27位, 8位随机数, 62进制]

技术点

伪随机数生成器:

MersenneTwister算法
Mersenne Twister算法译为马特赛特旋转演算法,是伪随机数发生器之一,其主要作用是生成伪随机数。此算法是Makoto Matsumoto (松本)和Takuji Nishimura (西村)于1997年开发的,基于有限二进制字段上的矩阵线性再生。可以快速产生高质量的伪随机数,修正了古老随机数产生算法的很多缺陷。

1
2
3
4
5
6
// PHP mt_rand() func
// mt_rand — Generate a random value via the Mersenne Twister Random Number Generator
echo mt_rand() . "\n"; // 1604716014
echo mt_rand() . "\n"; // 1478613278
echo mt_rand(5, 15); // 6