/miaoshaV2.0

Refactored and perfected the SECKILL V1.0, adding some new features

Primary LanguageJava

秒杀项目V2.0

1、前言:

之前的秒杀V1.0过于粗糙。到互联网公司实习数月以来,学习到开发中的新"姿势"。 回顾之前代码,深感自己老项目不足,人总是不断学习进步,基于实习期间所学,现进行项目重构与功能完善。

2、简介:

秒杀项目V1介绍及其不足之处:

当时too_young,代码的结构层次混乱,规范性不足,异常处理不完善,功能不全 此第二版本中,对以上问题进行完善

主要使用的技术: SpringBoot、SpringMVC、Mybatis-Plus、MySQL、Redis、Zookeeper、ElasticJob等

所做完善或增加的新功能:

  • 【完善】对项目结构进行重构,逻辑分层更清楚
  • 【完善】基于SpringBoot、Mybatis-plus简化开发
  • 【add】增加代码规范性,完善异常处理
  • 【add】增加用户登录拦截,用户登录,用户注册功能, done_90%(2020-07-25)
  • 【add】基于Es-job开发定时任务进行缓存预热防止缓存雪崩, done_100%(2020-07-25)
  • 【add】redis进行ip过滤限流, 加入ip黑名单功能,定时解封,done_100%(2020-07-29)
  • 【add】基于Redis#zSet实现的延时队列,模拟下单后30分钟内未付款的,取消其订单, done_80%, 延时队列已经实现,尚未模拟使用(2020-08-01)
  • 【add】引入消息队列削峰(TODO)

系统模块分层,使结构清晰,易于扩展:

  • seckill-admin 主要是登录校验(TODO)
  • seckill-app 主入口,controller及其处理逻辑
  • seckill-common 通用工具,比如Redis,线程池,延时队列
  • seckill-core 对数据进行的处理,主要使用的是mybatis-plus

3、数据库表的设计

秒杀系统的数据库的设计 以下为主要数据库表的设计,包括建立了一些合适的索引

  • 秒杀商品表
CREATE TABLE `seckill_product` (
  `id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '商品id',
  `name` VARCHAR(120) NOT NULL COMMENT '商品名称',
  `number` INT(11) NOT NULL COMMENT '库存数量',
  `start_time` DATETIME NOT NULL COMMENT '秒杀开启时间',
  `end_time` DATETIME NOT NULL COMMENT '秒杀结束时间',
  `create_time` DATETIME NOT NULL COMMENT '创建时间',
  `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
  `version` INT(11) NOT NULL COMMENT '版本号',
  PRIMARY KEY (`id`),
  KEY `idx_start_time` (`start_time`),
  KEY `idx_end_time` (`end_time`)
) ENGINE=INNODB AUTO_INCREMENT=1004 DEFAULT CHARSET=utf8 COMMENT='秒杀库存表';
  • 秒杀系统订单表
CREATE TABLE `seckill_order` (
  `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
  `order_id` varchar(32) NOT NULL COMMENT '订单id',
  `passport` BIGINT(20) NOT NULL COMMENT '用户账号',
  `product_id` BIGINT(20) NOT NULL COMMENT '秒杀的商品id',
  `status` TINYINT(4) NOT NULL COMMENT '状态标示:-1=无效,0=成功',
  `create_time` DATETIME NOT NULL,
  `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_passport` (`passport`),
  UNIQUE KEY `idx_productid_passport` (`product_id`, `passport`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='秒杀系统订单表';
  • 用户信息表
CREATE TABLE `seckill_user` (
  `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
  `passport` varchar(128) NOT NULL COMMENT '通行证',
  `password` varchar(128) NOT NULL COMMENT '密码',
  `phone_number` bigint(20) NOT NULL COMMENT '手机号码',
  `create_time` DATETIME NOT NULL,
  `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_id_userid` (`passport`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='用户信息表';
  • ip黑名单
CREATE TABLE `seckill_black_list` (
  `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
  `ip` varchar(128) NOT NULL COMMENT 'ip地址',
  `date_num` bigint(20) NOT NULL COMMENT '封禁日期',
  `create_time` DATETIME NOT NULL,
  `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_ip` (`ip`),
  KEY `idx_date_num` (`date_num`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='ip黑名单表';
  • 一些sql脚本
INSERT  INTO 
`seckill_product`(`id`,`name`,`number`,`start_time`,`end_time`,`create_time`,`version`,`create_time`) 
VALUES 
(1000,'1000元秒杀iphone8',100,'2018-05-10 15:31:53','2018-05-10 15:31:53','2018-05-10 15:31:53',0,now()),
(1001,'500元秒杀ipad2',100,'2018-05-10 15:31:53','2018-05-10 15:31:53','2018-05-10 15:31:53',0,now()),
(1002,'300元秒杀小米4',100,'2018-05-10 15:31:53','2018-05-10 15:31:53','2018-05-10 15:31:53',0,now()),
(1003,'200元秒杀红米note',100,'2018-05-10 15:31:53','2018-05-10 15:31:53','2018-05-10 15:31:53',0,now());

TRUNCATE TABLE

DELECT * FROM 

注意点

  • NOT NULL的数据插入时不得为空,包括create_time

一些坑: