1 秒杀设计

1.1 业务流程

​ 电商项目中,秒杀属于技术挑战最大的业务。后台可以发布秒杀商品后或者将现有商品列入秒杀商品,热点分析系统会对商品进行分析,对热点商品做特殊处理。商城会员可以在秒杀活动开始的时间内进行抢购,抢购后可以在线进行支付,支付完成的订单由平台工作人员发货,超时未支付订单会自动取消。

​ 当前秒杀系统中一共涉及到管理员后台、搜索系统、秒杀系统、抢单流程系统、热点数据发现系统,如下图:

1.2 秒杀架构

​ B2B2C商城秒杀商品数据一般都是非常庞大,流量特别高,尤其是双十一等节日,所以设计秒杀系统,既要考虑系统抗压能力,也要考虑系统数据存储和处理能力。秒杀系统虽然流量特别高,但往往高流量抢购的商品为数不多,因此我们系统还需要对抢购热门的商品进行有效识别。

​ 商品详情页的内容除了数量变更频率较高,其他数据基本很少发生变更,像这类变更频率低的数据,我们可以考虑采用模板静态化技术处理。

​ 秒杀系统需要考虑抗压能力,编程语言的选择也有不少讲究。项目发布如果采用Tomcat,单台Tomcat抗压能力能调整到大约1000左右,占用资源较大。Nginx抗压能力轻飘的就能到5万,并且Nginx占用资源极小,运行稳定。如果单纯采用Java研发秒杀系统,用Tomcat发布项目,在抗压能力上显然有些不足,如果采用Lua脚本开发量大的功能,采用Nginx+Lua处理用户的请求,那么并发处理能力将大大提升

​ ​ 下面是当前秒杀系统的架构图:

1.3 数据库设计

1.3.1 秒杀商品数据库

数据库名字:seckill_goods

秒杀活动表:tb_activity

    CREATE TABLE `tb_activity` ( `id` varchar(60) NOT NULL, `name` varchar(100) NOT NULL, `status` int(2) NOT NULL DEFAULT '1' COMMENT '状态:1开启,2未开启', `startdate` date DEFAULT NULL, `begintime` datetime DEFAULT NULL COMMENT '开始时间,单位:时分秒', `endtime` datetime DEFAULT NULL COMMENT '结束时间,单位:时分秒', `total_time` float DEFAULT NULL, `is_del` int(1) DEFAULT '1' COMMENT '删除:1未删除,2已删除', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

商品品牌表:tb_brand

CREATE TABLE `tb_brand` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '品牌id', `name` varchar(100) NOT NULL COMMENT '品牌名称', `image` varchar(1000) DEFAULT '' COMMENT '品牌图片地址', `letter` char(1) DEFAULT '' COMMENT '品牌的首字母', `seq` int(11) DEFAULT NULL COMMENT '排序', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=325468 DEFAULT CHARSET=utf8 COMMENT='品牌表';

秒杀商品分类表:tb_category

 CREATE TABLE `tb_category` ( `id` int(20) NOT NULL AUTO_INCREMENT COMMENT '分类ID', `name` varchar(50) DEFAULT NULL COMMENT '分类名称', `goods_num` int(11) DEFAULT '0' COMMENT '商品数量', `is_show` char(1) DEFAULT NULL COMMENT '是否显示', `is_menu` char(1) DEFAULT NULL COMMENT '是否导航', `seq` int(11) DEFAULT NULL COMMENT '排序', `parent_id` int(20) DEFAULT NULL COMMENT '上级ID', `template_id` int(11) DEFAULT NULL COMMENT '模板ID', PRIMARY KEY (`id`), KEY `parent_id` (`parent_id`) ) ENGINE=InnoDB AUTO_INCREMENT=11177 DEFAULT CHARSET=utf8 COMMENT='商品类目';

秒杀时刻表:tb_seckill_time

CREATE TABLE `tb_seckill_time` ( `id` int(10) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL COMMENT '秒杀分类名字,双十一秒杀,每日时段秒杀等', `starttime` time NOT NULL COMMENT '开始时间', `endtime` time DEFAULT NULL, `total_time` float(11,2) DEFAULT NULL COMMENT '秒杀时长,按小时计算', `status` int(2) DEFAULT '1' COMMENT '是否启用,1:启用,2:停用', `sort` int(2) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

秒杀商品表:tb_sku

CREATE TABLE `tb_sku` ( `id` varchar(60) NOT NULL COMMENT '商品id', `name` varchar(200) NOT NULL COMMENT 'SKU名称', `price` int(20) NOT NULL DEFAULT '1' COMMENT '价格(分)', `seckill_price` int(20) DEFAULT NULL COMMENT '单位,分', `num` int(10) DEFAULT '100' COMMENT '库存数量', `alert_num` int(11) DEFAULT NULL COMMENT '库存预警数量', `image` varchar(200) DEFAULT NULL COMMENT '商品图片', `images` varchar(2000) DEFAULT NULL COMMENT '商品图片列表', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '更新时间', `spu_id` varchar(60) DEFAULT NULL COMMENT 'SPUID', `category1_id` int(10) DEFAULT NULL COMMENT '类目ID', `category2_id` int(10) DEFAULT NULL, `category3_id` int(10) DEFAULT NULL, `category1_name` varchar(20) DEFAULT NULL, `category2_name` varchar(20) DEFAULT NULL, `category3_name` varchar(20) DEFAULT NULL COMMENT '类目名称', `brand_id` int(11) DEFAULT NULL, `brand_name` varchar(100) DEFAULT NULL COMMENT '品牌名称', `spec` varchar(200) DEFAULT NULL COMMENT '规格', `sale_num` int(11) DEFAULT '0' COMMENT '销量', `comment_num` int(11) DEFAULT '0' COMMENT '评论数', `seckill_end` datetime DEFAULT NULL COMMENT '秒杀结束时间', `seckill_begin` datetime DEFAULT NULL COMMENT '秒杀开始时间', `status` int(1) DEFAULT '1' COMMENT '商品状态 1普通商品,2参与秒杀', `islock` int(1) DEFAULT '1' COMMENT '是否锁定,1:未锁定,2:锁定', `seckill_num` int(11) DEFAULT NULL COMMENT '秒杀数量', PRIMARY KEY (`id`), KEY `cid` (`category1_id`), KEY `status` (`status`), KEY `updated` (`update_time`), KEY `spu_id` (`spu_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品表';

秒杀商品活动关联表:tb_sku_act

CREATE TABLE `tb_sku_act` ( `sku_id` varchar(60) NOT NULL, `activity_id` varchar(60) NOT NULL, PRIMARY KEY (`sku_id`,`activity_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

1.3.2 秒杀订单数据库

秒杀订单表:tb_order

 CREATE TABLE `tb_order` ( `id` varchar(60) COLLATE utf8_bin NOT NULL COMMENT '订单id', `total_num` int(11) DEFAULT NULL COMMENT '数量合计', `pay_type` varchar(1) COLLATE utf8_bin DEFAULT NULL COMMENT '支付类型,1、在线支付、0 货到付款', `create_time` datetime DEFAULT NULL COMMENT '订单创建时间', `update_time` datetime DEFAULT NULL COMMENT '订单更新时间', `pay_time` datetime DEFAULT NULL COMMENT '付款时间', `consign_time` datetime DEFAULT NULL COMMENT '发货时间', `end_time` datetime DEFAULT NULL COMMENT '交易完成时间', `close_time` datetime DEFAULT NULL COMMENT '交易关闭时间', `receiver_contact` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '收货人', `receiver_mobile` varchar(12) COLLATE utf8_bin DEFAULT NULL COMMENT '收货人手机', `receiver_address` varchar(200) COLLATE utf8_bin DEFAULT NULL COMMENT '收货人地址', `transaction_id` varchar(30) COLLATE utf8_bin DEFAULT NULL COMMENT '交易流水号', `order_status` char(1) COLLATE utf8_bin DEFAULT NULL COMMENT '订单状态,0:未完成,1:已完成,2:已退货', `pay_status` char(1) COLLATE utf8_bin DEFAULT NULL COMMENT '支付状态,0:未支付,1:已支付,2:支付失败', `consign_status` char(1) COLLATE utf8_bin DEFAULT NULL COMMENT '发货状态,0:未发货,1:已发货,2:已收货', `is_delete` char(1) COLLATE utf8_bin DEFAULT NULL COMMENT '是否删除', `sku_id` varchar(60) COLLATE utf8_bin DEFAULT NULL, `name` varchar(200) COLLATE utf8_bin DEFAULT NULL, `price` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `create_time` (`create_time`), KEY `status` (`order_status`), KEY `payment_type` (`pay_type`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

1.3.3 管理员数据库

管理员表:tb_admin

CREATE TABLE `tb_admin` ( `id` int(11) NOT NULL AUTO_INCREMENT, `login_name` varchar(20) DEFAULT NULL COMMENT '用户名', `password` varchar(60) DEFAULT NULL COMMENT '密码', `status` char(1) DEFAULT NULL COMMENT '状态', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

1.3.4 用户数据库

用户表:tb_user

CREATE TABLE `tb_user` ( `username` varchar(50) NOT NULL COMMENT '用户名', `password` varchar(100) NOT NULL COMMENT '密码,加密存储', `phone` varchar(20) DEFAULT NULL COMMENT '注册手机号', `email` varchar(50) DEFAULT NULL COMMENT '注册邮箱', `created` datetime NOT NULL COMMENT '创建时间', `updated` datetime NOT NULL COMMENT '修改时间', `nick_name` varchar(50) DEFAULT NULL COMMENT '昵称', `name` varchar(50) DEFAULT NULL COMMENT '真实姓名', PRIMARY KEY (`username`), UNIQUE KEY `username` (`username`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表';

收件地址表:tb_address

CREATE TABLE `tb_address` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(50) DEFAULT NULL COMMENT '用户名', `provinceid` varchar(20) DEFAULT NULL COMMENT '省', `cityid` varchar(20) DEFAULT NULL COMMENT '市', `areaid` varchar(20) DEFAULT NULL COMMENT '县/区', `phone` varchar(20) DEFAULT NULL COMMENT '电话', `address` varchar(200) DEFAULT NULL COMMENT '详细地址', `contact` varchar(50) DEFAULT NULL COMMENT '联系人', `is_default` varchar(1) DEFAULT NULL COMMENT '是否是默认 1默认 0否', `alias` varchar(50) DEFAULT NULL COMMENT '别名', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;