慕课网秒杀高并发前三个课程总结

来源:互联网 发布:淘宝昵称怎么改不了 编辑:程序博客网 时间:2024/05/18 22:41

花了三天,终于把慕课网上的前三个课程学完了,想在这里做一个小结。主要针对于接口的设计。
先介绍一下这个项目,这是一个秒杀高并发的项目,用ssm框架写的,所以要先掌握Spring,SpringMVC,Mybatis的基本知识。
先说一下整体的开发,我们把整个项目开发分为三部分,Dao层(数据库操作层),Service层(业务逻辑层),Web层。

首先我们想想对于一个秒杀网站,用户需要一些什么操作,我们对应的需要提供一些什么功能:
对于我们的秒杀,用户首先需要查看所有的秒杀列表,如果对哪一个秒杀感兴趣,会点开链接,进入到当前秒杀的详情页,详情页会有当前商品的名称和秒杀状态(秒杀未开始,秒杀进行中,秒杀结束,若是秒杀进行中,则需要显示一个倒计时,提供用户还有多长时间进行秒杀)

针对用户的这种需求,我们需要在service层里面创建一个有关秒杀操作的接口SeckillService,会有以下几个方法:
1、查询所有的秒杀商品(做成秒杀清单,显示在list.jsp页面上),返回一个List集合。
2、根据id查询单个的秒杀商品–做成秒杀商品详情页,显示在detail.jsp页面上,返回一个Seckill对象。
3、秒杀开启时获取秒杀的加密地址,秒杀未开启时获取秒杀的开启时间和当前时间–在商品详情页上显示出来,给用户直观的显示。根据这个要求,我们需要创建一个实体类Exposer,放在dto包中,dto是数据传输层,关注web与service之间的数据传递。
4、执行秒杀操作,我们要成功秒杀一个商品,我们首先需要减库存,然后添加购买记录。如果秒杀成功,我们需要返回秒杀成功记录,如果失败,我们需要返回错误信息。因此,我们还需要一个实体类SeckillExcution,来保存返回的信息,实体类应有一个状态标识,和状态信息,来区分这两个成功或失败。另外,这两者要同时成功,或者同时失败,这就需要一个事务管理器来管理。

public interface SeckillService {    /**     * 查询所有秒杀商品     * @return     */    List<Seckill> getSeckillList();    /**     * 查询单个秒杀商品     * @param seckillId     * @return     */    Seckill getById(Long seckillId);    /**     * 秒杀开启时输出秒杀接口的地址,     * 否则输出系统时间和秒杀时间     * @param seckillId     */    Exposer exportSeckillUrl(Long seckillId);    /**     * 执行秒杀操作     * @param seckillId     * @param userPhone     * @param md5     */    SeckillExcution executeSeckill(Long seckillId,Long userPhone,String md5)        throws SeckillException,SeckillCloseException,RepeatKillException;}

根据service层,我们来设计dao层,对应数据库的两张表,我们分别需要两个接口,SeckillDao和SeccessKilledDao分别实现对每张表的操作。,和两个实体类,Seckill和SuccessKilled来存放我们表内的信息,作为查询结果返回。
对于seckill秒杀商品这张表,SeckillDao我们需要以下方法接口:
1、查询所有的秒杀商品信息,返回一个Seckill对象。
2、根据id查询单个的秒杀商品信息,返回一个Seckill对象。
3、减库存操作,每当秒杀成功一件商品时,我们需要将对应的商品库存-1,返回一个int类型的值,来判断是否成功进行减库存操作。

public interface SeckillDao {    /**     * 减库存     * @param seckillId     * @param killTime     * @return 如果返回的int>1,则表示更新的记录行数     */    int reduceNumber(@Param("seckillId") Long seckillId,@Param("killTime") Date killTime);    /**     *根据id查询秒杀对象     * @param seckillId     * @return     */    Seckill queryById(Long seckillId);    /**     * 根据偏移量查询秒杀商品列表     * @param offset     * @param limit     * @return     */    List<Seckill> queryAll(@Param("offset") int offset,@Param("limit") int limit);}

对于success_killed这张表,SeccessKilledDao我们需要以下方法接口:
1、根据商品id查询相应的秒杀成功记录,返回一个SuccessKilled对象
2、插入购买明细,返回一个int类型的值,来判断是否插入成功。

public interface SuccessKilledDao {    /**     * 插入购买明细,通过联合主键可过滤重复     * @param seckillId     * @param userPhone     * @return 插入的行数     */    int insertSuccessKilled(@Param("seckillId") Long seckillId,@Param("userPhone") Long userPhone);    /**     *根据商品id查询秒杀成功记录,并且携带Seckill对象     * @param seckillId     * @return     */    SuccessKilled queryByIdWithSeckill(@Param("seckillId") Long seckillId,@Param("userPhone") Long userPhone);}

另外对应的dao层的每个接口,我们要通过对应的xml文件,写相应操作的sql语句,真正的对数据库进行操作。xml在此略去。

另外说一下这里的Seckill和SuccessKilled对象,都放在entity包中。entity包是作为dao层与service层之间的一个数据传递。一般来讲,数据库的一个表对应一个实体类,表中的属性对应实体类的私有成员。实体类里应有每个成员的get和set方法,toString方法,方便以后数据的操作。

最后再说一下我们的web层,之前的service和dao层都已经为我们把底层打好了,在web中,我们只需要运用底层的方法与对象来得到数据,并且通过Model返回到我们的页面上。

原创粉丝点击