分布式系统电商订单号的最佳生成方式

最近在研发区块链支付系统,众所周知,有支付必有订单。今天不做支付系统的具体分析,只来谈谈目前较为热门的订单号码生成方案!

在分布式高并发情况下,订单号必须满足最重要的一个条件:唯一性,订单关系这支付明细,与支付相关的向来都是最重要的,马虎不得。

目前较为成熟的,我所知道的有两种生成方案,接下来做一下对比:

1、根据MySQL自增主键生成订单号

首先,需要创建一张满足自增条件的表,有两个字段即可,id和value,id设置为自增,类型为bigint即可

eg:在mybatis框架中

<insert id="insertAndGetId" useGeneratedKeys="true" keyProperty="id" parameterType="com.chenzhou.mybatis.User">
    insert into user(userName,password,comment)
    values(#{userName},#{password},#{comment})
</insert>

其中useGeneratedKeys="true" 的配置就表示新增后返回主键id,此时我们就可以根据主键id做订单唯一性标识,再加上时间201903010+自增主键,或其他复杂的组合方式即可

此方式的优点:关系型数据库的可靠性!

此方式的缺点:在分布式环境下,需要保证新增的操作是单线程的,需要加锁。

2、利用Redis非关系型数据库

先看代码,再解释

 public String getOrderId(String prefix) {
        //生成订单号 redis incr
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        String time = sdf.format(new Date());
        //当天流水7位
        Long tx = redisTemplate.opsForValue().increment(CommonConstants.OUR_ORDER_ID_INCREMENT_KEY, 1);
        if (tx < CommonConstants.ORDER_ID_INCREMENT_DEFAULT_VALUE) {
            //没值,自动添加
            redisTemplate.opsForValue().set(CommonConstants.OUR_ORDER_ID_INCREMENT_KEY, CommonConstants.ORDER_ID_INCREMENT_DEFAULT_VALUE);
            tx = redisTemplate.opsForValue().increment(CommonConstants.OUR_ORDER_ID_INCREMENT_KEY, 1);
        }
        //自动补0
        String end = autoAddZero(String.valueOf(tx));
        return prefix + time + end;
    }

    public String autoAddZero(String liuShuiHao) {
        Integer intHao = Integer.parseInt(liuShuiHao);
        DecimalFormat df = new DecimalFormat(CommonConstants.ORDER_ID_NUM);
        return df.format(intHao);
    }
getOrderId方法,传入参数prefix,这是订单前缀,有时候我们需要为不同种类或功能生成不一样的订单前缀以助区分,其中最主要是用到了redis的incr函数。我们都知道redis是单行程的,每次操作都不会引发脏读的问题因此,我们可以利用redis的自增方法incr为我们的订单做唯一性处理。
tx < CommonConstants.ORDER_ID_INCREMENT_DEFAULT_VALUE 的判断是由于第一次调用是没有值的,需要设置一个初始值
autoAddZero是我写的辅助保持订单长度一致的方法,剩下的大写的都是常量,根据字面意思设置即可

此方法的优点:基于缓存策略的性能上明显提升。此方法的缺点:redis数据需要载入硬盘,防丢失(其实也不算缺点)

如有不妥,欢迎指正!

原文地址:https://www.cnblogs.com/tc520/p/10457977.html

时间: 2024-11-09 02:03:29

分布式系统电商订单号的最佳生成方式的相关文章

Java生鲜电商平台-电商订单系统全解析

Java生鲜电商平台-电商订单系统全解析 今天分享将会分为以下三个环节来阐述: 1.订单系统的介绍 2.订单系统的解构 3.垂直电商订单系统设计思路 一.什么是订单系统? 订单管理系统(OMS)是物流管理系统的一部分,通过对客户下达的订单进行管理及跟踪,动态掌握订单的进展和完成情况,提升物流过程中的作业效率,从而节省运作时间和作业成本,提高物流企业的市场竞争力.顾名思义,电商系统就是用户.平台.商户等对于订单的管控.跟踪的系统,衔接着商品中心.wms.促销系统.物流系统等,是电子商务的基础模块:

基于TableStore的海量电商订单元数据管理

摘要: # 一.背景 订单系统存在于各行各业,如电商订单.银行流水.运营商话费账单等,是一个非常广泛.通用的系统.对于这类系统,在过去十几年发展中已经形成了经典的做法.但是随着互联网的发展,以及各企业对数据的重视,需要存储和持久化的订单量越来越大. 一.背景订单系统存在于各行各业,如电商订单.银行流水.运营商话费账单等,是一个非常广泛.通用的系统.对于这类系统,在过去十几年发展中已经形成了经典的做法.但是随着互联网的发展,以及各企业对数据的重视,需要存储和持久化的订单量越来越大.数据的重视程度与

PHP电商订单自动确认收货redis队列

一.场景 之前做的电商平台,用户在收到货之后,大部分都不会主动的点击确认收货,导致给商家结款的时候,商家各种投诉,于是就根据需求,要做一个订单在发货之后的x天自动确认收货.所谓的订单自动确认收货,就是在在特定的时间,执行一条update语句,改变订单的状态. 二.思路 最笨重的做法,通过linux后台定时任务,查询符合条件的订单,然后update.最理想情况下,如果每分钟都有需要update的订单,这种方式也还行.奈何平台太小,以及卖家发货时间大部分也是密集的,不会分散在24小时的每分钟.那么,

电商订单ElasticSearch同步解决方案--使用logstash

一.使用logstash同步订单数据(订单表和订单项表)到ElasticSearch: 1.到官网下载logstash:https://www.elastic.co/cn/downloads/logstash 2.安装logstash前,确保需要先安装java的jdk环境 3.下载后,解压:之后千万别到bin环境点击logstash.bat这个命令启动,这样会报错的 4.接下来,在logstash安装目录找到config文件夹,在那里新增一个文件夹,我新建的为shop文件夹,然后在里面添加如下文

电商订单的操作

1 结算页面不进行任何业务层处理,购物车数据转订单详情 2 结算页面提交订单时,只能提交一次(防止表单重复提交) 防止表单重复提交具体步骤: 点击购物车结算按钮时→ 后台生成TradeCode交易码分别放在订单页面和redis缓存各一份 点击提交订单时→会将订单页面的交易码跟缓存里面的进行比对,如果为true,则重定向到支付页面,并删除redis缓存里的TradeCode交易码,如果用户回退,因为redis缓存的交易码已经用过并删除了,所以比对失败,跳到失败页面,达到防止表单重复提交的效果 代码

电商峰值系统架构设计--转载

1.1 系统架构设计目录 摘要:双11来临之际,<程序员>以“电商峰值系统架构设计”为主题,力邀京东.当当.小米.1号店.海尔商城.唯品会.蘑菇街.麦包包等电商企业,及商派.基调网络等服务公司,分享电商峰值系统架构设计的最佳技术实践. 自2009年11月11日,淘宝商城(现名天猫)拉开网购狂欢节的序幕,各大电商的促销浪潮此起彼伏.此时的电商大战不仅是价格之争,更是技术的较量.如何设计电商峰值系统来更好地满足用户蜂拥而至的访问,如何在海量数据处理中实时发现有效信息并转化为商机,成为众多电商企业密

跨境电商如何从商店沦为中介

一直以来,跨境电商都是电商行业里极其特殊的一个细分垂直领域.相比其他呈现高速发展态势的电商领域,跨境电商的发展轨迹就像是在玩过山车--时而一飞冲天,时而跌入低谷.而在发展的过程中,跨境电商也在不断转变自身形态.从最具雄心勃勃的自有商品电商平台,到现在迷茫彷徨,跨境电商的内心可谓五味杂陈. 近段时间以来的新政让一些依靠保税仓起家的跨境电商平台遭受重击.这种依靠补贴."特惠通关"等地区性扶+持政策维生的平台,不得不面临急迫转型,纷纷将目光聚焦在更为省事.受到政策较小影响的海外直购上.这种经

如何利用BI搭建电商数据分析平台

某电商是某大型服装集团下的重要销售平台.2015 年,该集团品牌价值达数百亿元,产品质量.市场占有率.出口创汇.销售收入连年居全国绒纺行业第一,在中国有终端店3000多家,零售额80 亿.其羊绒制品年产销能力1000万件以上的规模,占有中国的40%和世界的30%的市场份额. 该集团旗下的电商部门主要负责服装公司线上运营工作,涉及的平台有淘宝.天猫.京东.苏宁易购.唯品会等,每年涉及的流水金额大概在1亿RMB左右. 项目背景: 原来该公司旗下各品牌和部门的IT管理部门是独立的,没有归属于服装公司下

[原创]如何利用BI搭建电商数据分析平台

某电商是某大型服装集团下的重要销售平台.2015 年,该集团品牌价值达数百亿元,产品质量.市场占有率.出口创汇.销售收入连年居全国绒纺行业第一,在中国有终端店3000多家,零售额80 亿.其羊绒制品年产销能力1000万件以上的规模,占有中国的40%和世界的30%的市场份额. 该集团旗下的电商部门主要负责服装公司线上运营工作,涉及的平台有淘宝.天猫.京东.苏宁易购.唯品会等,每年涉及的流水金额大概在1亿RMB左右. 项目背景: 原来该公司旗下各品牌和部门的IT管理部门是独立的,没有归属于服装公司下