一分一毛也是爱

微信

微信

支付宝

支付宝

观海听潮

观海听潮博客

登录
还没有账号?去注册
观海听潮

观海听潮博客

注册
  • 欢迎来自美国弗吉尼亚州的访客,您好!
×

我的名片

网名:观海听潮

职业:PHP开发工程师

现居:山东省-青岛市

Email:1256699215@qq.com

网站统计

  • 观海听潮•博客
  • 54篇
  • 145条
  • 20435次
  • 196次
  • 美国弗吉尼亚州

您现在的位置是:首页  > 技术杂谈  > php php

观海听潮

高并发生成唯一的订单号

摘要
电商的订单号,在正常流程中,只精确到秒就可以啦,但是在高并发的时候,同一秒可能会有上千上万个请求,如何保证在这种情况下订单号不会有重复呢,我实现了两个方法,亲测有效。

1、方法一:

//20位的订单号,时间戳+随机数,时间戳是精确到微妙的时间戳,然后加3位随机数。

function getOrderNo(){

$houseNum = time()-strtotime(date('Y-m-d',time()));

       $time = date('ymd');

       $length = 20;

       $prefixTime = $time.$houseNum;

       $lastLen = $length - strlen($prefixTime);

       $utimestamp = microtime(true);

       $timestamp = floor($utimestamp);

       $milliseconds = round(($utimestamp - $timestamp) * 1000000);

       $orderNo = $prefixTime.$milliseconds;

       if($lastLen-strlen($milliseconds)>0){

           for($i=0;$i<($lastLen-strlen($milliseconds));$i++){

               $orderNo .= rand(1,9);

           }

       }

       return $orderNo;

}

方法二:

//时间戳+redis生成的唯一数字

//18位的订单号,时间戳是精确到秒的,redis的key是秒级为单位的,在同一秒中,随着请求数在递增,是不会重复的。然后确定位数,补0;

function getOrderNo(){

       $houseNum = time()-strtotime(date('Y-m-d',time()));

       $time = date('ymd');

       $length = 18;//默认18位

       $prefixTime = $time.$houseNum;

       $lastLen = $length - strlen($prefixTime);

       $redis = new \Redis();

       $redis->connect('127.0.0.1', 6379);

       $reqNoKey = 'OrderNoKey:'.date('YmdHis'); // 设置redis键值,每秒钟的请求次数        

       $reqNo = $redis->incr($reqNoKey); // 将redis值加1        

       $redis->expire($reqNoKey, 5); // 设置redis过期时间,避免垃圾数据过多  

       if($lastLen-strlen($reqNo)>0){

           for($i=0;$i<($lastLen-strlen($reqNo));$i++){

               $prefixTime .= '0';

           }

       }

       $orderNo = $prefixTime.$reqNo;

       return $orderNo;

}


讨厌 (0)
微博logo QQ空间logo QQlogo 豆瓣logo 人人logo 百度贴吧logo 有道云笔记logo

文章评论

表情表情
×
图片图片

评论列表