秒杀系统特点
人多商品少
时间短流量高
外挂机器[黄牛和非黄牛]

技术分析
瞬间高并发的处理能力
多层次的分布式处理能力
人机交互与对抗[12306验证码图片]

技术选型分析
Linux+Nginx+PHP+Mysql+Redis
CDN,智能DNS,分布式缓存,全国多节点,多线路接入
LVS负载均衡

基本功能和流程
后台:活动管理/商品管理/订单管理/日志管理,数据列表和内容的编辑增删(逻辑删除)改查
前台:商品展示/抢购/我的订单/购物车/登录等功能
安全:验证码/回答/分析日志,防攻击、防作弊、防机器人

用户大概访问交互流程
用户进来的时候先看到秒杀商品的展示页面,然后从页面选择商品参与秒杀,参与秒杀时需要提交验证码,验证用户登录状态等之类的验证,把问答或者一些验证信息填完之后就可以提交订单完成秒杀功能,然后等待结果,有可能成功或者失败,提示一些信息,用户能够感知到的秒杀流程。

用户选择想要秒杀的商品,输入了要购买的商品数量,点击提交,这时候我们的秒杀程序就要开始响应了,于是秒杀开始。
先验证用户提交信息,比如还有用户登录状态,验证问答信息或者更多的信息。先验证信息是否对,如果有错误,那么提示错误信息,如果对,那么进入库存验证,如果库存不足,或者活动结束了,提示库存不足,那么秒杀结束。如果订单提交成功,那么生成订单,生成订单时会有订单相关的数据处理,比如库存的更新等。毕竟是并发提交,有可能生成订单也会出现问题,如果生成订单环节出现了问题,即使前面的环节通过,在此环节也会出现问题,比如订单生成的时候,前面的一个人先生成了订单,库存不足了,还会出错,所以在这个环节一定还会有其他的异常信息出现,那么还需要给用户提交错误信息,如果没出错,那么秒杀成功。

以上大概流程是不可或缺的,也是有点粗略。如果我们流程仅仅这几个点的话,那么我们的流程中其实还差的很多。我们在设计过程中,先列出来,还需要根据这几个流程进行补充。
程序运行起来会有几个输入的验证:如问答的验证,用户登录状态验证,用户是否进入黑名单,以及参数的验证,商品信息的参数,活动信息的参数,其他校验信息的参数验证等。
还有输出的验证:异常情况的输出和成功正常情况的输出。

其他情况:比如购买的库存是一种商品的话,在处理的时候要容易一点,会做一下比较。如果是多件商品的话,每个商品就需要每个进行验证。如果商品还有类型的区分,比如手机有好多种型号,那么还需要根据型号处理。有的时候还会涉及到优惠券等等。。

数据库设计
基本的数据模型大概有哪些?
活动信息、商品信息、订单信息、问答信息等模型

---活动信息表

CREATE TABLE `active` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '活动ID',
`title` varchar(255) NOT NULL COMMENT '活动名称',
`time_begin` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '开始时间',
`time_end` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '结束时间',
`sys_dateline` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
`sys_lastmodify` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最后修改时间',
`sys_status` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '状态,0 待上线,1 已上线,2 已下线',
`sys_ip` varchar(50) NOT NULL COMMENT '创建人IP',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='活动信息表';

---商品信息表

CREATE TABLE `goods` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '商品ID',
`active_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '活动ID',
`title` varchar(255) NOT NULL COMMENT '商品名称',
`description` text NOT NULL COMMENT '描述信息,文本,要支持HTML',
`img` varchar(255) NOT NULL COMMENT '小图标,列表中显示',
`price_normal` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '原价',
`price_discount` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '秒杀价',
`num_total` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '总数量',
`num_user` int(10) unsigned NOT NULL DEFAULT '1' COMMENT '单个用户限购数量',
`num_left` int(11) NOT NULL DEFAULT '0' COMMENT '剩余可购买数量',
`sys_dateline` int(11) NOT NULL DEFAULT '0' COMMENT '信息创建时间',
`sys_lastmodify` int(11) NOT NULL DEFAULT '0' COMMENT '最后修改时间',
`sys_status` int(11) NOT NULL DEFAULT '0' COMMENT '状态,0 待上线,1 已上线,2 已下线',
`sys_ip` varchar(50) NOT NULL COMMENT '创建人的IP',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='商品信息表';

---日志记录表[用于做核查]

CREATE TABLE `ms_log` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '日志ID',
`active_id` int(10) unsigned NOT NULL COMMENT '活动ID',
`uid` int(10) unsigned NOT NULL COMMENT '用户ID',
`action` varchar(50) NOT NULL COMMENT '操作名称',
`result` varchar(50) NOT NULL COMMENT '返回信息',
`info` text NOT NULL COMMENT '操作详情,JSON格式保存,比如:POST,refer, 浏览器等信息',
`sys_dateline` int(10) unsigned NOT NULL COMMENT '创建时间',
`sys_lastmodify` int(10) unsigned NOT NULL COMMENT '最后修改时间',
`sys_status` int(10) unsigned NOT NULL COMMENT '状态,0 正常,1 异常,2 已处理的异常',
`sys_ip` varchar(50) NOT NULL COMMENT '用户IP',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='秒杀的详细操作日志';

---问答信息表[防止机器人黄牛]

CREATE TABLE `ms_question` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '问答ID',
`active_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '所属活动ID',
`title` varchar(255) NOT NULL COMMENT '问题描述',
`ask1` varchar(255) NOT NULL COMMENT '问题1',
`answer1` varchar(255) NOT NULL COMMENT '答案1',
`ask2` varchar(255) NOT NULL,
`answer2` varchar(255) NOT NULL,
`ask3` varchar(255) NOT NULL,
`answer3` varchar(255) NOT NULL,
`ask4` varchar(255) NOT NULL,
`answer4` varchar(255) NOT NULL,
`ask5` varchar(255) NOT NULL,
`answer5` varchar(255) NOT NULL,
`ask6` varchar(255) NOT NULL,
`answer6` varchar(255) NOT NULL,
`ask7` varchar(255) NOT NULL,
`answer7` varchar(255) NOT NULL,
`ask8` varchar(255) NOT NULL,
`answer8` varchar(255) NOT NULL,
`ask9` varchar(255) NOT NULL,
`answer9` varchar(255) NOT NULL,
`ask10` varchar(255) NOT NULL,
`answer10` varchar(255) NOT NULL,
`sys_dateline` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
`sys_lastmodify` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最后修改时间',
`sys_status` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '状态,0 正常,1 删除',
`sys_ip` varchar(50) NOT NULL COMMENT '发布人的IP',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='问答信息表';

---订单信息表

CREATE TABLE `ms_trade` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '订单ID',
`active_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '活动ID',
`goods_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '商品ID',
`num_total` int(10) unsigned NOT NULL DEFAULT '1' COMMENT '购买的单品数量',
`num_goods` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '购买的商品种类数量',
`price_total` decimal(10,0) unsigned NOT NULL DEFAULT '0' COMMENT '订单总金额',
`price_discount` decimal(10,0) unsigned NOT NULL DEFAULT '0' COMMENT '优惠后实际金额',
`time_confirm` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '确认订单时间',
`time_pay` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '支付时间',
`time_over` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '过期时间',
`time_cancel` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '取消时间',
`goods_info` mediumtext NOT NULL COMMENT '订单商品详情,JSON格式保存',
`sys_dateline` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
`sys_lastmodify` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最后修改时间',
`sys_status` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '状态,0 初始状态,1 待支付,2 已支付,3 已过期,4 管理员已确认,5 已取消,6 已删除,7 已发货,8 已收货,9 已完成',
`sys_ip` varchar(50) NOT NULL COMMENT '用户IP',
`uid` int(10) unsigned NOT NULL COMMENT '用户ID',
`username` varchar(50) NOT NULL COMMENT '用户名',
PRIMARY KEY (`id`),
KEY `uid` (`uid`),
KEY `active_id` (`active_id`),
KEY `goods_id` (`goods_id`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8 COMMENT='订单信息表';

PHP秒杀系统全方位设计(一)的更多相关文章

  1. PHP秒杀系统全方位设计(二)

    商品页面开发 静态化展示页面[效率要比动态PHP高很多,PHP程序需要解析等步骤,本身就需要很多流程,整个下来PHP的处理花的时间和资源要多] 商品状态的控制 开始前.进行中.库存不足.结束 数据逻辑 ...

  2. Java商城秒杀系统的设计与实战视频教程(SpringBoot版)_汇总贴

    51CTO学院 Java商城秒杀系统的设计与实战视频教程(SpringBoot版) H:\BaiDu\微服务0830\2019最新 Java商城秒杀系统的设计与实战视频教程(SpringBoot版) ...

  3. Redis秒杀系统架构设计-微信抢红包

    导读 前二天我写了一篇,Redis高级项目实战(点我直达),SpringBoot整合Redis附源码(点我直达),今天我们来做一下Redis秒杀系统的设计.当然啦,Redis基础知识还不过关的,先去加 ...

  4. PHP秒杀系统全方位设计分析(一)

    秒杀系统特点人多商品少时间短流量高外挂机器[黄牛和非黄牛] 技术分析瞬间高并发的处理能力多层次的分布式处理能力人机交互与对抗[12306验证码图片] 技术选型分析Linux+Nginx+PHP+Mys ...

  5. 阿里P8架构师谈:阿里双11秒杀系统如何设计?

    秒杀是电商业务里的标志性事件,这样的典型高并发场景会遇见什么样的挑战呢,然后又是如何来解决的呢? 秒杀活动场景 淘宝双11秒杀场景,大量的用户短时间内涌入,瞬间流量巨大(高并发),比如:1000万人同 ...

  6. Java商城秒杀系统的设计与实战视频教程(SpringBoot版)

    课程目标掌握如何基于Spring Boot构建秒杀系统或者高并发业务系统,以及构建系统时采用的前后端技术栈适用人群Spring Boot实战者,微服务或分布式系统架构实战者,秒杀系统和高并发实战者,中 ...

  7. PHP秒杀系统全方位设计分析(二)

    商品页面开发 静态化展示页面[效率要比动态PHP高很多,PHP程序需要解析等步骤,本身就需要很多流程,整个下来PHP的处理花的时间和资源要多] 商品状态的控制 开始前.进行中.库存不足.结束 数据逻辑 ...

  8. 2019最新 Java商城秒杀系统的设计与实战视频教程(SpringBoot版)_2-2微服务项目的搭建-SpringBoot搭建多模块项目二

    一些重要的配置文件直接复制过来了 jdbc和shiro的配置 application.properties里面的相关配置项的含义 日志界别的配置 数据返回到前端的json的配置 数据源的配置 需要新建 ...

  9. Java秒杀系统实战系列~整体业务流程介绍与数据库设计

    摘要: 本篇博文是“Java秒杀系统实战系列文章”的第三篇,本篇博文将主要介绍秒杀系统的整体业务流程,并根据相应的业务流程进行数据库设计,最终采用Mybatis逆向工程生成相应的实体类Entity.操 ...

随机推荐

  1. 《JavaScript权威指南》读书笔记——JavaScript核心

    前言 这本由David Flanagan著作,并由淘宝前端团队译的<JavaScript权威指南>,也就是我们俗称的“犀牛书”,算是JS界公认的“圣经”了.本书较厚(有1004页),读起来 ...

  2. _3_form_标签

    什么是input标签? 处理输入信息 input有哪些类型? 选择: <input type="checkbox"> 多选框,选择爱好等 <input type= ...

  3. Windows脚本修改主机名-不重启

    windows通过脚本方式修改主机名的方法有很多种,下面介绍修改注册表方式的脚本. 使用方法: 1 打开cmd,假如脚本名为ModifyHostname.bat 2 执行脚本,并加入脚本参数,其中第一 ...

  4. Junit4X系列--hamcrest的使用

    OK,在前面的一系列博客里面,我整理过了Assert类下面常用的断言方法,比如assertEquals等等,但是org.junit.Assert类下还有一个方法也用来断言,而且更加强大.这就是我们这里 ...

  5. java常用类--正则表达式

    正则表达式到底是什么? 在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要.正则表达式就是用于描述这些规则的工具.换句话说,正则表达式就是记录文本规则的代码. 很可能你使用过W ...

  6. MySQL常见SQL语句用法

    标签(linux): mysql 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 表字段类型 TINYINT 微小整数类型,可存储的容量为1字节 INT 整数类型 ...

  7. 2018-01-28-M个本地工作点代码同步到N个GIT远端

    layout: post title: 2018-01-28-M个本地工作点代码同步到N个GIT远端 key: 20180128 tags: IT GIT modify_date: 2018-01-2 ...

  8. Windows--查看使用某端口的进程

    场景: 有时候我们希望查找某个端口被那个进程使用,如何操作呢? 比如查找8000端口被按个进程使用? 首先使用netstat -ano |grep 8000查看 13776就是使用的进程ID 然后使用 ...

  9. hdu3507 Print Article

    Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) P ...

  10. spring-boot 使用 main函数 无法启动的问题完美 解决方案。

    首先 是启动之后 ,直接回exit code  0,网址 里面输入localhost:8080显示站点未启动.网上查 了多种 方式 ,日志 也 打了,都没发现问题,最后到这篇文章里 找到了答案.但是这 ...