那么不使用缓存(redis、memcache),如何设计高效抢购业务呢?

常见的抢购业务主要有:

商品抢购

券抢购

红包抢购

今天咱们就谈谈如何对这些抢购业务做统一设计,只使用Mysql做高并发活动。

我们先看下面一张表,分别标出了这三类业务涉及到的核心数据量:

核心数据量

数据量商品库存券库存红包库存数据金额

1.总量

totalNum

totalNum

totalMoney

总金额

2.销售量

sellNum

sellNum

sellMoney

领取金额

3.锁定量

lockNum

lockNum

0

锁定金额

4.库存量

stockNum

stockNum

stockMoney

库存金额

5.退货量

refundNum

refundNum

0

0

6,库存池

inventory

inventory

-

-

我们再看下这些业务涉及到的核心节点的数据量变化

核心数据量变化(变化量为n)

节点名称总量销售量锁定量库存量退货量

下单

totalNum不变

sellNum不变

lockNum+n

stockNum不变

refundNum不变

取消订单

totalNum不变

sellNum不变

lockNum-n

stockNum不变

refundNum不变

支付

totalNum不变

sellNum+n

lockNum-n

stockNum-n

refundNum不变

核销

totalNum不变

sellNum不变

lockNum不变

stockNum不变

refundNum不变

退款

totalNum不变

sellNum-n(或不变)

lockNum不变

stockNum+n(或不变)

refundNum+n

节点设计

我们知道,每个操作节点最少可对应一个操作。而我们为了保证接口效率最高,我们需要尽量少的使用sql操作,如果每个接口只有一次数据操作那是最好的。

但是,每个接口的逻辑可能都会涉及到若干数据业务操作,而我们为了能让这些抢购业务性能尽量好,那我们就要尽量把接口原子化设计。而在这些接口中,下单操作时重中之重,只要把这个下单接口设计好了,后续流程基本都没啥大问题。

下单接口设计

那我们来分析一下下单接口的设计业务:

检查库存是否够用

防止并发超卖

锁库存

等等...

那这些要求改如何同时满足呢?那就要我们尽量合理使用核心数据量了!

那我们在设计库存表的时候,尽量把总量、销售量、锁定量、库存量放到一起,可以如下设计:

CREATE TABLE `goods_stock` (

`ID` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',

`SPU_ID` bigint(20) NOT NULL DEFAULT '0' COMMENT '商品SPU_ID',

`SKU_ID` bigint(20) NOT NULL DEFAULT '0' COMMENT '商品SKU ID',

`STOCK_LEFT_NUM`int(11) NOT NULL DEFAULT '0' COMMENT '剩余库存数量',

`STOCK_SALE_NUM`int(11) NOT NULL DEFAULT '0' COMMENT '售卖库存数量',

`STOCK_LOCK_NUM`int(11) NOT NULL DEFAULT '0' COMMENT '被锁定的库存数量',

`STOCK_TOTAL_NUM`int(11) NOT NULL DEFAULT '0' COMMENT 'SKU总库存量,0表示不限制库存',

`STATUS` tinyint(4) NOT NULL DEFAULT '0' COMMENT '本条记录状态,0-有效,1-无效',

`CREATE_TIME` datetime NOT NULL COMMENT'创建时间',

`UPDATE_TIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT'更新时间',

`VERSION`int(11) NOT NULL DEFAULT '0' COMMENT '乐观锁版本号',

PRIMARY KEY (`ID`),

KEY `IDX_SPU_ID` (`SPU_ID`),

KEY `IDX_SKU_ID` (`SKU_ID`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品SKU库存表';

其他字段在实例中省略了。

我们看看如何使用这一张表满足上述要求:

1,检查库存是否够用:

STOCK_LEFT_NUM >= n

2,防止并发超卖:

利用数据库行级锁防并发

WHERE SKU_ID = ${sku_id}

3,锁库存:

STOCK_LOCK_NUM = STOCK_LOCK_NUM + n

那么,具体的下单、取消订单、支付等业务节点就可以如下实现:

1,下单

UPDATE `goods_stock`

SET `STOCK_LOCK_NUM`= `STOCK_LOCK_NUM` +${lockNum}

WHERE `STOCK_LEFT_NUM`= ]]>${lockNum}

AND `SKU_ID`=${skuId}

AND ${lockNum} ]]> 0

当该操作执行成功,再处理其他逻辑;如果失败,就直接返回下单失败。

2,取消订单

UPDATE `goods_stock`

SET `STOCK_LOCK_NUM`= `STOCK_LOCK_NUM` -${lockNum}

WHERE `SKU_ID`=${skuId}

AND ${lockNum} ]]> 0

3,支付订单

UPDATE `goods_stock`

SET `STOCK_LOCK_NUM`= `STOCK_LOCK_NUM` -${lockNum},

`STOCK_SALE_NUM`= `STOCK_SALE_NUM` +${lockNum},

`STOCK_LEFT_NUM`= `STOCK_LEFT_NUM` -${lockNum}

WHERE `STOCK_LOCK_NUM`= ]]>${lockNum}

AND `SKU_ID`=${skuId}

AND ${lockNum} ]]> 0

目前MySql+SD硬盘的话,MySql事务并发量达到2000是没啥压力的,所以一般并发2000左右的都可以直接使用MySql数据库设计业务逻辑,无需使用Redis缓存。

这里只是给出了商品库存核心逻辑,券和其类似,不过还多一点库存池(存放券码),其实这个可以放到后台去处理了;红包比这个更简单,只有下单(领红包)操作。

共同学习QQ群:793305035

java 抢购代码_Java生鲜电商平台-生鲜电商限时抢购功能设计与代码实战(小程序/APP)...相关推荐

  1. Java生鲜电商平台-商品中心的架构设计与源码解析(小程序/APP)

    Java生鲜电商平台-商品中心的架构设计与源码解析(小程序/APP) 说明:Java生鲜电商平台中,由于商品的架构很大程度决定了电商的扩展性与伸缩性.对此根据自己多年的生鲜电商经验,整理了以下的商品中 ...

  2. java 超卖_Java生鲜电商平台-秒杀系统如何防止超买与超卖?(小程序/APP)

    本文主要是通过实际代码讲解,帮助你一步步搭建一个简易的秒杀系统.从而快速的了解生鲜电商秒杀系统的主要难点,并且迅速上手实际项目. 我对生鲜电商秒杀系统文章的规划: 从零开始打造简易秒杀系统:乐观锁防止 ...

  3. WANLSHOP 直播短视频种草多用户电商系统源码自营+多商户+多终端(H5+小程序+APP)

    WANLSHOP高级版 可用于自营+外包项目(多主体). 可用于外包定制开发项目. 提供开源源码,私有化部署.一款基于 FastAdmin + Uni-APP 开发的 多终端(H5移动端.APP.微信 ...

  4. 电商系统中API接口防止参数篡改和重放攻击(小程序/APP)

    说明:目前所有的系统架构都是采用前后端分离的系统架构,那么就不可能避免的需要服务对外提供API,那么如何保证对外的API的安全呢? 即生鲜电商中API接口防止参数篡改和重放攻击 目录 1. 什么是AP ...

  5. 今年最新任务平台红利系统/悬赏威客积分墙系统接单小程序APP的优势在哪?

    什么是任务红利平台呢? 今天给大家说说这个<任务红利平台>话题吧! 我们的系统属于聚合平台类型,什么是聚合类型呢!顾名思义就是把各大资源整合在一个站点上,这样的一个聚合站会让你省事很多,买 ...

  6. Java生鲜电商平台-生鲜电商高并发下的接口幂等性实现与代码讲解

    说明:Java生鲜电商平台-生鲜电商高并发下的接口幂等性实现与代码讲解,实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返回一样的结果.例如: 前端重复提交选中的数据,应该后台只产生对应这 ...

  7. 巨人java生鲜app下载_Java生鲜电商平台-生鲜电商商品中心系统设计与数据库架构(生鲜小程序/APP)...

    Java生鲜电商平台-生鲜电商商品中心系统设计与数据库架构(生鲜小程序/APP) 说明:Java生鲜电商平台-生鲜电商商品中心系统设计与数据库架构(生鲜小程序/APP) 日日鲜-商品中心系统设计 项目 ...

  8. Java生鲜电商平台-微服务入门与服务的拆分架构实战

    Java生鲜电商平台-微服务入门与服务的拆分架构实战 刚开始进入软件行业时还是单体应用的时代,前后端分离的概念都还没普及,开发的时候需要花大量的时间在"强大"的JSP上面,那时候S ...

  9. Java生鲜电商平台-微服务生鲜电商用户中心的系统设计(小程序/APP)

    Java生鲜电商平台-微服务生鲜电商用户中心的系统设计(小程序/APP) 说明:在微服务生鲜电商用户中心的系统设计中,我一直强调一个观点,就是你这个系统使用用户到底是TO B的还是TO C的呢?这个是 ...

最新文章

  1. 邮件数据恢复解决方法
  2. 正则化的通俗解释_干货|深度学习中的正则化技术概述(附Python+keras实现代码)...
  3. [No0000F4]C# 枚举(Enum)
  4. 为集合排序的三个方法
  5. SpringBoot自定义Starter(自动配置类)
  6. 10深入Redis Cluster
  7. 使用python绘制常用的图表
  8. 工控机运行linux,什么是linux嵌入式工控机
  9. async的waterfall
  10. 用U盘打造专属个人的微型护航系统--winpe
  11. GitHub上AI岗位面试笔记(机器学习算法/深度学习/ NLP/计算机视觉)
  12. html表单设计姓名性别,编写一个表单页面census.html,让用户填写姓名、性别(男女选择)、兴趣(运动,读书,音乐,书法及其他)...
  13. 替换加密(恺撒加密法)
  14. 性能指标:队列深度、IOPS与时延
  15. 《孤尽班T31-01-架构理论笔记》
  16. Android带标题的列表,Listview Section 多个标题以及内容
  17. 瓜子云的任务调度系统
  18. 著名童星刘佳琪深圳市中心举办个人Live音乐汇专辑发布会圆满成功
  19. 物联网设备群的软件仿真
  20. 使用OpenSSL签发证书

热门文章

  1. vue项目中使用大图片提前预加载处理方案
  2. 项目管理之加班那点事
  3. 你的最爱(网址收藏栏)
  4. 公司想辞退的你六种表现,你get到了么?
  5. 学习 canvas (七)实现圆球水波进度
  6. Java开发工程师面试-基础
  7. 深入浅出设计模式之命令模式
  8. 浙江大学远程教育计算机应用基础,浙江大学远程教育计算机应用基础2014年秋-2Windows知识题详细分解.docx...
  9. 基因共表达网络分析java,好用的基因共表达网络分析工具
  10. SSM-山东省职称申报评审管理系统