【服务器开发系列】订单号生成策略

简介: 订单是整个电子商务的核心,整个电子商务的流程也是围绕订单展开的;本文与大家分享一下各大电子商务网站订单号的生成方式。


1
订单号是什么?


它是您在购物网站购物后获得的订单号,记录的是购物订单信息;在您需要与购物网站进行订单查询等操作时,需要给购物网站提供商家订单号。


2几种常见下单途径?


  1. Web网站下单。
  2. 打电话到呼叫中心(CallCenter)下单
  3. 手机Wap下单。


如果采用常见的单数据库来存储的话,随着订单量的增加,单库的写压力增大,造成数据库服务器性能下降。一般会采用分库来缓解数据库服务器的压力。


有的同学可能会问:怎么来进行分库呢?


Web来源订单,存入Web订单库;CallCenter来源订单,存入CallCenter订单库;Wap来源订单,存入Wap订单库;最终,将这三种类型的数据库同步到订单主库中。


那么,问题来了,怎么把不同的订单同步到订单主库呢?


这里就引出了文章的主题订单号。电商网站一般利用订单号来作为订单表的主键;因此,我们必须保证订单号不重复,才能将订单安全的同步到订单主库中。


3订单命名规定


  • 唯一性


这个大家都明白,主要保证订单号不重复。


  • 安全性


订单编号不能透露你公司的真实运营信息,比如你的订单就是流水号的话,那么别人就可以从订单号推测出你公司的整体运营概括了。所以订单编码必须是除了你们公司少部分人外,其他人基本看不懂的。可以参考京东和淘宝的编码规则。


  • 不能使用大规模随机码


因为大规模的随机码随机生成,因为本身就没有意义所以无所谓泄密了。但是事实上这种编码规则在实现上会有很大问题的。随机码满足第二点安全性要求,为了满足唯一性,那就得在生成随机码的时候对比历史数据是否有重复,如果你的订单数量到达了十万次,你每次生成订单编码时就得对比十万条历史数据。


这里有同学可能会问:随机码就不能在编码中使用了吗?


小规模的随机码是可以使用的,比如2~3位,这种随机码一般都是和流水号等结合使用,主要作用是为了隐藏流水号的真实数据而进行使用的。


  • 防止并发


主要针对编码中有时间的设定。


  • 控制位数


订单号的作用就是便于查询。一般正常使用场景应该是订单出异状或者退货的时候,用户将订单号报给客服,由客服进行查询。所以一般在10~15位为好。目前京东11位,淘宝16位。


4怎么保证订单号的唯一性?


作者在此,提供两种思路供大家参考。


  • 订单号命名规则来生成


比如:业务编码 + 时间戳 + 机器编号[前4位] + 随机4位数 + 毫秒数


说明:业务编码(OrderType: Web=1 CallCenter=2 Wap=3) 机器编号(用来表示由那台服务器生成的订单)


见伪代码,如下:


import org.apache.commons.lang3.RandomStringUtils;
public static String genOrderNo(OrderType type){
    Date curDate = new Date();
    String orderType = getType(type);
    String dateStr4yyyyMMddHHmmss = new SimpleDateFormat("yyyyMMddHHmmss").format(curDate);
    String dateStr4SSS = new SimpleDateFormat("SSS").format(curDate);
    String random = RandomStringUtils.random(4,false,true);
    String machineCode = getMachineCode().substring(0,4);
    return orderType+dateStr4yyyyMMddHHmmss+machineCode+random+dateStr4SSS;
}


技术上没有一本万利的方法,这种方法也有缺点的,这种方式在高并发下会频繁更新订单量记录表,很容易产生锁表。但是锁表问题也是可以解决的,加一层缓存。


  • 全局订单号数据池来生成


数据库创建一个订单号数据库表(order_id_generator);利用python脚本生成一批订单号,将这批订单号存入到order_id_generator表中。生成订单时,会首先调用事务GET_ORDER_ID_FOR_REGISTER,获得当前订单号,再生成订单。这样就保证了子库订单号不会重复。


数据库代码如下:


CREATE TABLE `order_id_generator` (
  `RANDOM_VALUE` bigint(20) NOT NULL,
  `ORDER_ID` int(11) NOT NULL,
  PRIMARY KEY (`RANDOM_VALUE`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP PROCEDURE IF EXISTS `GET_ORDER_ID_FOR_REGISTER`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` PROCEDURE `GET_ORDER_ID_FOR_REGISTER`()
BEGIN
    declare userMid int default 0; 
    declare randomValue bigint default 0;
    start transaction;
        select ORDER_ID, RANDOM_VALUE into orderId, randomValue from order_id_generator limit 1 for update;
            if userMid > 0 then
                delete from order_id_generator where RANDOM_VALUE = randomValue;
            end if;
    commit;
    select orderId from dual;
END
;;
DELIMITER ;


伪代码如下:

/**
 * 得到一个订单号。
 *
 * @return
 */
Long getIdForOrder();

总结:订单号的生成方案,需要根据目前的订单量而定;因为任何方案都有自己特定的业务场景。

相关文章
|
6月前
|
安全 网络安全 数据安全/隐私保护
游戏服务器安全需要注意什么方面需要搭配什么防护策略
游戏服务器安全需要注意什么方面需要搭配什么防护策略
|
22天前
|
存储 数据库 虚拟化
无缝过渡:企业级服务器迁移的策略与最佳实践
【10月更文挑战第4天】随着企业数字化转型的加速,服务器迁移成为企业IT基础设施升级的重要环节。本文从架构与规划的视角,探讨了企业级服务器迁移的策略与最佳实践,旨在帮助企业实现无缝过渡,降低迁移风险,提高迁移效率。
68 4
|
3月前
|
运维 jenkins Linux
【Jenkins稳定运维】服务器频繁崩溃?资深管理员的应对策略
本文分享了作者作为管理员在面对服务器频繁崩溃时的应对策略,包括使用Shell脚本优化运维工作、学习Jenkins Pipeline插件以及一些运维技能扩展,强调了在运维工作中不断学习和实践的重要性。
48 0
【Jenkins稳定运维】服务器频繁崩溃?资深管理员的应对策略
|
3月前
|
开发者 Windows Android开发
跨平台开发新选择:揭秘Uno Platform与.NET MAUI优劣对比,帮你找到最适合的框架,告别选择困难症!
【8月更文挑战第31天】本文对比了备受关注的跨平台开发框架Uno Platform与.NET MAUI的特点、优势及适用场景。Uno Platform基于WebAssembly和WebGL技术,支持Windows、iOS、Android及Web平台,而.NET MAUI由微软推出,旨在统一多种UI框架,支持Windows、iOS和Android。两者均采用C#和XAML进行开发,但在性能、平台支持及社区生态方面存在差异。Uno Platform在Web应用方面表现出色,但性能略逊于原生应用;.NET MAUI则接近原生性能,但不支持Web平台。开发者应根据具体需求选择合适的框架。
97 0
|
3月前
|
缓存 UED 开发者
全面加速Angular应用:从代码拆分到服务器端渲染的性能优化全攻略——深入探讨提升加载速度的有效策略
【8月更文挑战第31天】在现代Web开发中,提升应用加载速度对增强用户体验至关重要,尤其对于使用Angular框架的单页应用而言更是如此。本文通过解答五个常见问题,提供了一份全面的Angular性能优化攻略,涵盖减少初始加载时间、处理大型第三方库、优化变更检测、利用缓存以及服务器端渲染等技术。通过这些方法,开发者能够显著提升应用性能,确保流畅高效的用户体验。
47 0
|
4月前
|
SQL 关系型数据库 MySQL
MySQL服务器性能调优的顶级策略14
【7月更文挑战第14天】MySQL服务器性能调优的顶级策略
63 12
|
5月前
|
弹性计算 安全 Shell
阿里云ECS安全加固:从访问控制到数据保护的全方位策略
【6月更文挑战第29天】阿里云ECS安全聚焦访问控制、系统加固及数据保护。安全组限定IP和端口访问,密钥对增强SSH登录安全;定期更新补丁,使用防病毒工具;数据备份与加密确保数据安全。多维度策略保障业务安全。
157 15
|
4月前
|
弹性计算 运维 Kubernetes
阿里云ECS与混合云策略结合,提供云上云下无缝对接,提升业务灵活性和运维效率。
【7月更文挑战第3天】阿里云ECS与混合云策略结合,提供云上云下无缝对接,提升业务灵活性和运维效率。ECS支持多种计费模式和先进架构,保证低延迟计算。混合云融合公有云灵活性与私有云安全,实现资源最优配置。通过VPC互通、应用迁移、数据同步实践,确保安全合规,助力企业数字化转型。阿里云服务展示技术实力,支持企业在混合云时代抓住机遇。
130 3
|
4月前
|
弹性计算 运维 Kubernetes
阿里云ECS与混合云策略的结合,不仅为企业搭建了一个既灵活又稳定的IT基础架构,还为业务的快速发展与创新提供了坚实的技术支撑。
【7月更文挑战第3天】阿里云ECS在混合云中扮演关键角色,提供弹性计算资源和多样计费模式,确保业务连续性与灵活性。通过VPC互通、应用迁移、数据同步服务,如VPC对等连接、DTS,实现云上云下资源的高效整合。结合安全解决方案,保证在混合环境下的合规与安全。阿里云ECS助力企业数字化转型,应对市场变化。
120 1
|
6月前
|
弹性计算 运维 监控
【阿里云弹性计算】ECS实例的生命周期管理:阿里云自动化工具与策略介绍
【5月更文挑战第29天】阿里云提供自动化工具和策略管理ECS实例生命周期,如资源编排服务(ROS)实现一键部署,通过模板定义实例配置;自动化运维服务(OOS)执行自动化运维任务;弹性伸缩策略动态调整实例数量;定时启动/停止策略节省成本;监控告警策略确保业务连续性。通过这些工具和策略,企业可实现ECS实例的高效管理。
108 2