订单号的设计

生成规则设计 http://hudeyong926.iteye.com/blog/1860360

订单号生成规则 系统时间随即号|系统时间数据库自增号

前阵子,公司有个电子商务项目,需要生成订单号。当时的考虑很简单,取系统时间加上随机数,或者使用 uniqid() 方法。我们都知道,订单号最基本的要求就是唯一,这个条件必须满足。仔细考虑下上述方法,在顾客购买量少的情况下,订单重复的可能性为零,但是在购买高蜂期生成的订单号重复是很有可能发生的 。所以上述方法不可靠,有待强化。

Java代码   收藏代码
  1. function get_order_sn(){  
  2.     //原来的订单号形式为:年月日 + 5位随机数字,例如:2012042096200  
  3.     return date('Ymd') . str_pad(mt_rand(199999), 5'0', STR_PAD_LEFT);  
  4. }  

用上了英文字母、年月日、Unix 时间戳和微秒数、随机数,重复的可能性大大降低,还是很不错的。使用字母很有代表性,一个字母对应一个年份,总共16位,不多也不少,呵呵。substr(time(), -3)

Java代码   收藏代码
  1. function get_order_sn($year='2011'){  
  2.     $yCode = array('A''B''C''D''E''F''G''H''I''J');  
  3.     $index = intval(date('Y')) - $year;  
  4.     if($index<0){  
  5.         $index =0;  
  6.     }  
  7.     if($index>count($yCode)-1){  
  8.         $index =count($yCode)-1;          
  9.     }  
  10.       
  11.     $perfix = $yCode[$index] . strtoupper(dechex(date('m'))) . date('d');  
  12.     $rand_num = substr(uniqid(),-6).substr(time(), -5) . substr(microtime(), 25).sprintf('%03d', rand(099));  
  13.     $orderSn = $perfix . $rand_num;  
  14.     return $orderSn;  
  15. }  

第三种

Java代码   收藏代码
  1. //生成24位唯一订单号码,格式:YYYY-MMDD-HHII-SS-NNNN,NNNN-CC,其中:YYYY=年份,MM=月份,DD=日期,HH=24格式小时,II=分,SS=秒,NNNNNNNN=随机数,CC=检查码  
  2. function get_order_sn()  
  3. {  
  4.     //订单号码主体(YYYYMMDDHHIISSNNNNNNNN)  
  5.     $order_id_main = date('YmdHis') . rand(1000000099999999);  
  6.   
  7.     //订单号码主体长度  
  8.     $order_id_len = strlen($order_id_main);  
  9.     $order_id_sum = 0;  
  10.     for ($i = 0; $i < $order_id_len; $i++) {  
  11.         $order_id_sum += (int)(substr($order_id_main, $i, 1));  
  12.   
  13.     }  
  14.     //唯一订单号码(YYYYMMDDHHIISSNNNNNNNNCC)  
  15.     return $order_id_main . str_pad((100 - $order_id_sum % 100) % 1002'0', STR_PAD_LEFT);  
  16. }  

第四种

Java代码   收藏代码
  1. function get_order_sn()  
  2. {  
  3.     return date('Ymd') . substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 713), 1))), 08);  
  4. }  

1.如果生成订单不要求订单号连续,订单号CHAR(6)NOT NULL DEFAULT '',先保存订单后得到自增的主键,再根据主键更新订单号,高并发也不存在问题,推荐此方法 。

Java代码   收藏代码
  1. $id = last_insert_id();  
  2. 'M'. str_pad($id, 5'0', STR_PAD_LEFT);  

2.如果生成的订单要求订单号必须是连续的,并发加锁 ,要保证订单连续订单号必须在订单生成的同时++,但是多人同时操作时会出现订单号相同的冲突。解决方法:http://hudeyong926.iteye.com/blog/894823

Java代码   收藏代码
  1. $sql="SELECT `next_seq`  FROM `create_seq_num` LIMIT 1;UPDATE `create_seq_num` SET `next_num`=`next_num` + 1";   

建立一张订单号预约表,表中的订单号有效期1个小时,在有效期内被预约的号码会被用户占用,和优先使用,其他人不能使用,超过1小时就表示放弃了预约,如果用户还是用的是这个号码,就提示订单号失效了,用户必须重新获取订单号在继续操作。其他用户可以使用该号码。

当用户1在订单作业时,在使用订单号200910G0016时,这个订单号就被预约了,其他人就不能使用它了,其他人就只能用下一个订单号。在一个小时内,用户1没有完成一单,不管怎样重新下单他就只能使用订单号200910G0016,超过1小时候就不能使用了。如果完成了预约(将订单号200910G0016生成了一张订单,就要删除这个号)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值