这是一个秒杀系统的项目实战,目的很简单,用户传入请求,即购买请求,服务端响应这个请求,然后对应的数据库减去该值。但是要保证高并发情况下还能正常运行就不是这么简单了,我们需要引入分布式锁,还有消息中间件,在mysql上还要做优化,分布式情况下要保证商品的唯一id,redis要用来实现数据缓存。其实就做这个项目就是想将自己学到的知识都整合起来
首先是最基本的不考虑高并发情况下的情形:
一:想要进行秒杀首先要获取参与秒杀的商品吧,我是基于mvc开发的,也是以这个作为指导。
那么我们首先要有controller层,用于接受用户的请求,这就是获取商品列表的方法:
当获取了商品后,我们再把商品放入modelMap中,便于前端获取该项目。不过,在这之前,要具体实现获取商品列表这个方法。也就是在controller层调用service去真正地处理这个请求,因为这里controller只是用来展示的。
当然,也很简单,调用该方法即可
下面是sql查询语句:
假如是要参与秒杀的商品,首先,该商品需要参与这个活动,其次,还在秒杀时间范围内。此sql语句就是判断是否参加和是否过期的语句
然后,我们秒杀一件商品还需要知道商品的详情信息吧,依然是controller调用service,service调用mapper方法。
其实就变了一点,就是这次是条件查询了
接下来,就正式开始秒杀了,秒杀的核心逻辑如下:
这是controller,具体的秒杀行为去了killservice
这一段就是真正的秒杀行为了,首先,要判断用户是否进行过秒杀了,我想的是每个用户只能秒杀一件,所以你不能重复秒杀,然后,会获得秒杀的商品的详情信息,在设置商品秒杀的数据表里有一行是canKill,就是判断是否能够进行秒杀的,如果为1,则能秒杀,为0,则不能秒杀,其实就是判断是否秒杀的时间过了或者还没到。如果可以进行秒杀的话,那么库存减一,如果扣除成功了,就生成这个秒杀订单,然后通知用户秒杀成功了,至于为什么要这么做,就是为了提高对用户的响应速度,不然如果大量请求进来,要么数据库崩掉,要么用户在这里等待,直到处理完了才会返回结果,这样的话用户的体验就会不好,至于消息队列具体是怎么应用的,等到后面来用rabbitmq具体实现,这里只是大概实现该功能。
最后返回一个结果给前端,前端渲染后会返回给用户,具体就是这样,大体框架有了,下面就是具体补细节了