慕课网秒杀高并发前三个课程总结
来源:互联网 发布:淘宝昵称怎么改不了 编辑:程序博客网 时间: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返回到我们的页面上。
- 慕课网秒杀高并发前三个课程总结
- 16.三个学习原则和课程总结
- 软件体系结构前四周课程总结
- ICS课程中前6个lab的总结
- 课程总结
- 课程总结
- 课程总结
- 慕课网秒杀高并发课程学习(tj了,日后再写!)
- js课程笔记(一)前五节课基础内容总结
- 本月前三个自然月
- 并发编程中的三个概念
- 并发编程的三个概念
- 三个学生四门课程的问题
- 并发总结
- 并发总结
- 数据库三个函数总结
- Linux课程总结
- 种子班课程总结
- QT-关于程序异常错误的解决思路
- 代码理解—IRGAN(QA)_dataPrepare
- c++中vector的使用:如何求二维vector的大小以及insert函数的用法
- Http psot 传输方式
- 【上下界最小流】BZOJ2502 清理雪道
- 慕课网秒杀高并发前三个课程总结
- 动手实操(一) | 如何用七牛云 API 实现相片地图?
- SpringMVC中的自定义视图使用
- eval()函数详解
- python读取excel,数字都是浮点型,日期格式是数字的解决办法(转)
- 关于有偿提供拼图响应式后台的通知
- ODBC学习笔记—SQLSetStmtAttr
- [数论]HDU 2504 又见GCD
- php curl模拟post请求和提交多维数组的示例代码