商品订单ID简易算法

Posted zyjfire

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了商品订单ID简易算法相关的知识,希望对你有一定的参考价值。

算法目标:支持中小型支付系统,单机房生成订单号QPS<=1w,保证订单号绝对唯一,机房内趋势递增;

 

序列号生成算法(字符串订单号):

{2字节,机房唯一序列号}{14字节,年月日时分秒}{3字节,毫秒}{3字节,微秒}{4字节,自增序列号}

 

举例:

机房A:

"{01}{20171028195147}{655}{851}{0001}" =》"01201710281951476558510001" 

"{01}{20171028195147}{655}{851}{0002}" =》"01201710281951476558510002"


机房B:
"{02}{20171028195147}{010}{118}{0001}" =》"02201710281951470101180001"

 

分析:

机房序列号:机房唯一标识,自分配

年月日时分秒:如题

毫秒:如题

微秒:如题

自增序列号count:这里使用redis集群(同机房机器须使用相同的集群)生成,根据"{2字节,机房序列号}{14字节,年月日时分秒}{3字节,毫秒}{3字节,微秒}"作为key,使用INCR命令生成,当INCR返回1时,给KEY设置过期时间EXPIRE,防止同一微秒生成相同的订单号

伪代码如下:

cout = INCR 0120171028195147655851
if count == 1:
EXPIRE 0120171028195147655851 60
最终订单号 = "01201710281951476558510001" 

 看到另一个不错的实现算法

function build_order_no(){
  return "ID".date(‘Ymd‘).substr(implode(NULL, array_map(‘ord‘, str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
}

这套算法可以支撑非大型电商平台的订单系统,如果要追求更高的QPS,可以参考snowflake算法;
————————————————

 


版权声明:本文为CSDN博主「带鱼兄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/daiyudong2020/article/details/78378490

以上是关于商品订单ID简易算法的主要内容,如果未能解决你的问题,请参考以下文章

php 如何生成订单号

Mapjoin和Reducejoin案例

如何获取订单商品 ID 以获取一些产品元数据?

用户购物(数据库)案例

LeetCode(数据库)- 每件商品的最新订单

获取订单成功页面上的简单商品信息