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

技术分析
瞬间高并发的处理能力
多层次的分布式处理能力
人机交互与对抗[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. PHP秒杀系统全方位设计(一)

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

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

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

  4. PHP秒杀系统 高并发 高性能的极致挑战 下载

    第1章 课程介绍 秒杀系统在各种网站和应用中经常会用到.本课程从基本的系统设计和基础功能开始教导大家用PHP来设计和实现秒杀系统,并且为海量并发提供更高级的技术方案和实现手段. 第2章 系统技术选型分 ...

  5. 【Todo】秒杀系统材料

    秒杀系统:Link <一个经验证可落地的秒杀系统实践思路> 主要依赖于Redis进行处理. http://geek.csdn.net/news/detail/59847   淘宝大秒系统设 ...

  6. PHP秒杀系统-高并发高性能的极致挑战

    慕课网实战教程后端:1.java c++算法与数据结构2.java Spring Boot带前后端 渐进式开发企业级博客系统3.java Spring Boot企业微信点餐系统4.java Sprin ...

  7. 用Redis轻松实现秒杀系统

    秒杀系统的架构设计 秒杀系统,是典型的短时大量突发访问类问题.对这类问题,有三种优化性能的思路: 写入内存而不是写入硬盘 异步处理而不是同步处理 分布式处理 用上这三招,不论秒杀时负载多大,都能轻松应 ...

  8. Java高并发秒杀系统API之SSM框架集成swagger与AdminLTE

    初衷与整理描述 Java高并发秒杀系统API是来源于网上教程的一个Java项目,也是我接触Java的第一个项目.本来是一枚c#码农,公司计划部分业务转java,于是我利用业务时间自学Java才有了本文 ...

  9. Java高并发秒杀系统【观后总结】

    项目简介 在慕课网上发现了一个JavaWeb项目,内容讲的是高并发秒杀,觉得挺有意思的,就进去学习了一番. 记录在该项目中学到了什么玩意.. 该项目源码对应的gitHub地址(由观看其视频的人编写,并 ...

随机推荐

  1. 开源内容管理系统Joomla3.5发布 基于PHP 7

    导读 作为深受广大站长喜爱的Joomla开源内容管理系统(Content Management System, CMS)正式推出3.5版本,这也是首个完全支持PHP 7语言开发的Joomla版本,基于 ...

  2. Cognos组织架构介绍

    Cognos只是一个工具,说到Cognos相信大部分人都知道BI(商业智能,Business Intelligence). Cognos也是属于SOA架构,面向服务的体系结构,是一个组件模型,它将应用 ...

  3. fopen()函数文件模板中w,w+,a,a+的区别

    "w" 写入方式打开,将文件指针指向文件头并将文件大小截为零.如果文件不存在则尝试创建之. "w+" 读写方式打开,将文件指针指向文件头并将文件大小截为零.如果 ...

  4. github 's usage

    author:headsen  chen date: 2018-05-30   10:50:56 notice:This  article is created by headsen chen him ...

  5. 一 Android Studio 打包Egret App

    测试环境: Android Studio 2.3.2 Egret Engine 5.0.14 Egret Support5.0.12 官网教程:http://developer.egret.com/c ...

  6. Objective-C实用类和协议

    Objective-C实用类和协议 目录 概述 NSObject 概述 NSObject 协议<NSObject> 类NSObject 详细方法参考文档 实用操作 是否为某个类或其子类 是 ...

  7. Caused by: java.lang.ClassNotFoundException[android的终极解决错误]

    from:http://blog.csdn.net/changemyself/article/details/7861525 08-13 18:29:22.924: E/AndroidRuntime( ...

  8. 160316、实时处理oracle数据库中表的数据变化

    http://blog.csdn.net/as339000204/article/details/45390727     近期接受项目需求,需要实时处理oracle数据库中表的数据变化,首先想到的是 ...

  9. JAVAWEB基础模块开发顺序与数据访问对象实现类步骤

    一.模块的开发的顺序 1. 定义数据表 2. 新建模型类 3. 新建"add.jsp" 4. 实现AddServlet中的doGet()方法 5. 定义Dao.Service接口 ...

  10. PAT 甲级 1025 PAT Ranking

    1025. PAT Ranking (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Programmi ...