商品订单号生成规则

发表于  菜鸟之路   2016-04-11   字数:1620   阅读量: 586    字号:   赞: 2    

商品订单号生成规则

最近在做商城项目,涉及到订单号的设计问题,开始没想那么全面,后来在网上看了别人的分析之后才发现一个小小的订单号生成也大有学问。
对于订单号生成需要注意的问题,以下这个故事讲得很清楚了:

你是个程序员。

隔壁老王通过你老婆找到你,说要做个”巨牛逼电商网站”,并许诺给你股份若干,你想想首付也攒了好久,就差200万就够了,于是就同意了,你花了一个星期做了一个网站并上线运营,订单号格式如下:

日期+6位自增数字

例如:

20160301000001
20160301000002
20160301000003
20160301000004

你很开心,这天你加班改完bug回家,老王从你的衣柜里跳出来对你说,不行啊大兄弟,为什么对门老张的”超屌电商网站”每天都知道我们有多少订单量呢?

没办法,你只能回去继续修改代码。

这就是最基本的流水号的问题,不仅仅会暴露你的交易量,而且有规律的订单号很容易成为安全隐患。

你又把订单号改为即时生成‘日期+6位随机数字’,并且也做了重复检查,心想这回应该没问题了吧,运营了一周之后,半夜里老王又从你的床底下爬出来说,不行啊大兄弟,为什么每天晚上下单都很慢/下单失败(取决于失误的大小)呢?。

没办法,你只能回去继续修改代码。

这就是即时随机数的问题,不仅仅是检测重复的性能差,你想一下一共六位数字理论值100万条,假设当天下单记录已有80w,接下来再下单可能会不断的随机并且产生的随机数都已经存在,而且,这种方式并发如果处理不好就会导致下单失败(数据库unique)或者相同订单号(数据库非unique)。

你苦思冥想,终于想到了解决办法,我每天把明天要用的订单号先随机好,放进redis之类的缓存里里随用随取,这样就不会有性能和并发的问题了,回家发现老婆不在家,于是你开心的玩起了dota。

这里已经很接近订单池的概念了,不过因为这个池子没有流动性,就让我们暂且叫做订单桶吧,每天都要往桶里打水。

随着用户量的增长,你们决定在三月三号做一个”对3促销节”,你在办公室监视着服务器,突然老王用你家座机给你打电话,大兄弟你快看下,下不了单了,你熟练的连接上服务器查找着问题,发现生成的订单号已经被用完了,这一天的促销不得不停止。

于是你又连续加班了三个月,做了一个实时监控订单号熟练的系统,当低于xxxxx的时候迅速生成新的订单号,并且买了更多的服务器,做了更多的集群,可以同时预留出更多的订单号等等等等。

**这就是现在订单池的概念,随着订单号的被消费还继续生成着订单号,这个涉及的内容就很复杂了。**

我讲这个故事不是想说隔壁老王跟你老婆的关系,也不是房价到底有多贵,创业公司到底怎么样,而是软件开发往往不是一蹴而就的,所有的东西都是不断进化的,你不可能起步就按照京东淘宝的标准来,根据实际情况实际分析就可以了,脱离需求谈实现都是耍流氓,比如就是一个内部的ERP,用户不超过200,每天生成订单量不超过50,用自增有问题么?我觉得没问题啊。你说呢。

作者:幂恩
链接:http://www.zhihu.com/question/19805896/answer/89087529
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

最终确定的方案是:2位业务号+4位年月日+5位时分秒+4位随机数
两位业务号可以区分业务类型,比如01代表虚拟商品,02代表实物商品等等;年月日本来是8位,如20160101,不要开头两位也有6位,但是别人很容易看出来规律,可以设定一个参考日期,然后用下订单的日期减去参考日期,得到最终天数,一年是365天,四位表示年月日可以支撑20年,时分秒正常有6位,010203,可以将其转化为秒数,既能隐藏真实下单时间,又可以减少位数。最后四位随机数预先生成好,考虑到订单量不大,10000个订单足够用了,可以设置一个自增序列,里面存10000个随机数,要用的时候按顺序取,用完了再从第一条记录开始取。


已有 7 条评论
  1. 小柒

    UUID 哈哈哈

    2016年12月6日 14:38来自QQ 回复
  2. helloworld

    用uuid在客户端生成订单号就可以啦

    2016年7月16日 14:51 回复
  3. 原来还有这么高的学问啊

    2016年6月14日 14:19 回复
  4. 差点把域名看成了gayboy.org

    2016年6月12日 22:17来自iPhone 回复
  5. 好厉害的感觉。

    2016年5月23日 15:20 回复
  6. 80060510

    哈哈。站长真行专心至志了,还在搞研发!今后大器可成。【奇草导航】

    2016年4月23日 18:38 回复
  7. 做项目还是进步很快啊!

    2016年4月16日 21:31 回复