概述
随着互联网电商的兴起,各种活动层出不穷。秒杀活动作为一种经典活动具有瞬时并发大的特点,同时秒杀设计也是面试常考题之一,本文以单机为示例设计开发秒杀系统。
源码地址: https://gitee.com/tech-famer/farmer-seckill
效果展示
系统分析
- 秒杀页面静态化
- 倒计时时间服务器中获取
- 秒杀活动开始前隐藏秒杀链接
- 秒杀限流
- 秒杀商品redis缓存
- 防止超卖
系统设计
表结构设计
create datebase seckill;
use seckill;
CREATE TABLE seckill.`goods` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`goods_name` varchar(32) NOT NULL COMMENT '商品名称',
`goods_price` decimal(10,2) NOT NULL COMMENT '商品价格',
`goods_count` int(11) NOT NULL COMMENT '剩余数量',
`total_count` int(11) NOT NULL COMMENT '总数量',
`start_time` datetime NOT NULL COMMENT '开始时间',
`end_time` datetime NOT NULL COMMENT '结束时间',
`create_user` varchar(32) NOT NULL COMMENT '创建用户',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_user` varchar(32) NOT NULL COMMENT '更新用户',
`update_time` datetime NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='秒杀商品表';
CREATE TABLE eckill.`secorder` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`order_no` varchar(32) NOT NULL COMMENT '订单号',
`goods_id` bigint(20) NOT NULL COMMENT '商品ID',
`goods_name` varchar(32) NOT NULL COMMENT '商品名称',
`goods_num` int(11) NOT NULL COMMENT '商品数量',
`amount` decimal(10,2) NOT NULL COMMENT '订单总价',
`pay_seq` varchar(32) NOT NULL COMMENT '支付流水号',
`order_status` varchar(2) NOT NULL COMMENT '订单状态',
`goods_snapshots` text NOT NULL COMMENT '商品快照',
`user_id` varchar(32) NOT NULL COMMENT '购买用户',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_user` varchar(32) NOT NULL COMMENT '更新用户',
`update_time` datetime NOT NULL COMMENT '更新时间',
`pay_time` datetime DEFAULT NULL COMMENT '支付时间',
`expire_time` datetime NOT NULL COMMENT '过期时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='秒杀订单表'
页面静态化
大型电商平台的页面一般在做活动的时候会租用CDN服务,将静态资源放到CDN服务来避免每次用户刷新页面请求服务器带来压力。静态页面会利用浏览器缓存静态资源,在用户持续刷新页面时,浏览器直接读取缓存而非直接请求链接获取。
单机具体做法如下: