1.养成在官网查找资料的习惯。官网地址:
logback配置:http://logback.qos.ch/manual/configuration.html
spring配置:http://docs.spring.io/spring/docs/
mybatis配置:http://mybatis.github.io/mybatis-3/zh/index.html
2.maven命令创建web骨架项目(添加各个技术及框架的依赖)
3.业务分析
商家-库存-用户
秒杀过程的核心内容其实是对库存的处理。
用户-库存(秒杀后-减少库存,记录购买明细)-》组成一个完整的事务-需要数据落地(MySQL)。
一些非关系型的数据库都称为NoSQL,它属于是分布式的范畴,但是对事务的支持做的不好,而事务机制是现在最有效、最可靠的数据落地方案。
购买行为(谁购买了、成功的有效时间、付款发货信息)
4.分析难点:
对于秒杀活动,会存在大量的用户进行秒杀。反映到MySQL的问题就是事务和行级锁。
事务的工作机制主要是:
Start Transaction开启事务
Update 库存数量 //难点
Insert 购买明细
Commit
行级锁:
更新库存:update table set num= num-1 where id = 10 and num>1
当有多个用户同时提交这个秒杀需求时,只有一个减库存任务进行,其他用户只能暂时等待。一直等到这个事务commit之后, 它才可以获得行级锁。
秒杀的难点其实就是如何去高效的处理竞争。
5.实现秒杀功能:
秒杀接口暴露
执行秒杀
相关查询
6.代码开发阶段
DAO设计编码
service设计编码
Web设计编码
7.src-main-sql-schema.sql:
//创建数据库
CREATE DATABASE seckill;
//使用数据库
use seckill;
//创建秒杀库存表
CREATE TABLE seckill(
'seckill_id' bigint NOT NULL AUTO_INCREMENT '商品库存id',
'name' varchar(120) NOT NULL COMNNENT '商品名称',
'number' int NOT NULL COMMENT '库存数量',
'start_time' timestamp NOT NULL COMMETN '秒杀开始时间',
'end_time' timestamp NOT NULL COMMETN '秒杀结束时间',
PRIMARY_KEY(seckill_id),
key idx_start_time(start_time),
key idx_end_time(end_time),
key idx_create_time(create_time)
)ENGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT=utf-8 COMMENT='秒杀库存表'
create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间';
//初始化数据
insert into seckill(name,number,start_time,end_time)
values
('1000元秒杀Iphone',100,'2015-11-01 00:00:00','2015-11-02 00:00:00'),
('600元秒杀Ipad',200,'2015-11-01 00:00:00','2015-11-02 00:00:00'),
('200元秒杀小米',200,'2015-11-01 00:00:00','2015-11-02 00:00:00'),
('100元秒杀Ipod',100,'2015-11-01 00:00:00','2015-11-02 00:00:00');
//秒杀成功明细表
//用户登录认证相关的信息
create table success_killed(
'seckill_id' bigint NOT NULL COMMENT '秒杀商品id',
'user_phone' bigint NOT NULL COMMENT '用户手机号',
'state' tinyint NOT NULL DEFAULT -1 COMMENT '状态标识:-1 无效 0 成功 1 已付款 2 已发货',
'create_time' timestamp NOT NULL COMMENT '创建时间',
PRIMARY KEY(seckill_id,user_phone),
key idx_create_time(create_time)
)ENGINE=InnoDB DEFAULT CHARSET=utf-8 COMMENT='秒杀成功明细表';
//连接数据库控制台(本地数据库)
mysql -uroot -p
//查看创建该表时的代码
show create table seckill