zoukankan      html  css  js  c++  java
  • PHP秒杀系统全方位设计分析(一)

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

    技术分析
    瞬间高并发的处理能力
    多层次的分布式处理能力
    人机交互与对抗[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='订单信息表';
  • 相关阅读:
    中国的南方人和北方人有什么区别?总算说透了!
    怎样通过穴位按摩来减轻脚踝扭伤的疼痛
    关于脚踝不得不说的各种事
    电影发烧友必备知识-720P、1080P、4K的区别
    有什么相见恨晚的小知识?
    男生有钱到底有多重要?
    es6学习笔记5--promise
    es6学习笔记4--数组
    js设计模式总结1
    es6学习笔记3--解构和对象
  • 原文地址:https://www.cnblogs.com/wt645631686/p/8242809.html
Copyright © 2011-2022 走看看