秒杀系统
秒杀系统主要要解决时间问题和库存问题。
1.需求分析
所谓“秒杀”,就是网络卖家发布一些超低价格的商品,所有买家在同一时间网上抢购的一种销售方式。通俗一点讲就是网络商家为促销等目的组织的网上限时抢购活动。由于商品价格低廉,往往一上架就被抢购一空,有时只用一秒钟。
秒杀商品通常有两种限制:库存限制、时间限制。
需求:
(1)商家提交秒杀商品申请,录入秒杀商品数据,主要包括:商品标题、原价、秒杀价、商品图片、介绍等信息
(2)运营商审核秒杀申请
(3)秒杀频道首页列出秒杀商品(进行中的)点击秒杀商品图片跳转到秒杀商品详细页。
(4)商品详细页显示秒杀商品信息,点击立即抢购实现秒杀下单,下单时扣减库存。当库存为或不在活动期范围内时无法秒杀。
(5)秒杀下单成功,直接跳转到支付页面(微信扫码),支付成功,跳转到成功页,填写收货地址、电话、收件人等信息,完成订单。
(6)当用户秒杀下单5分钟内未支付,取消预订单,调用微信支付的关闭订单接口,恢复库存。
2.秒杀实现思路
秒杀技术实现核心思想是运用缓存减少数据库瞬间的访问压力!读取商品详细信息时运用缓存,当用户点击抢购时减少缓存中的库存数量,当库存数为时或活动期结束时,同步到数据库。产生的秒杀预订单也不会立刻写到数据库中,而是先写到缓存,当用户付款成功后再写入数据库。
3.时间问题-倒计时方案
1).首先确定活动开始时间,和基准时间,即当前时间(SELECT NOW),以一台服务器时间为准(服务器之间的时间是有差距的)。
2).活动开始时间是固定的。
3).用活动开始时间-基准时间,获取倒计时。
4).在redis服务器中用expire设定一个key的过期时间,过期时间为3)中计算的时间,并用TTL命令获取有效时间(倒计时时间),并用js在首页展示倒计时时间(以秒为单位)。
5).当key失效时表示活动开始(TTL=-2表示当前key失效)
6).为防止用户利用漏洞在活动还没开始就能以秒杀价抢到商品,可以在秒杀前对key进行判断是否失效,如果失效(TTL=-2)表示开始,如果不失效,活动没开始不能抢购商品。
4.库存问题-秒杀方案(具体实施步骤)
1)首先把库存数量放到redis服务器中
2)活动开始(开始秒杀),当用户抢到商品时,利用decr命令对库存数量做自动减操作。
3)当库存量为时表示最后一个商品被抢
4)当库存为负数表示商品已经抢完,库存量不为负数时表示商品没有被抢完。
5)利用定时器不断扫描预订单,判断用户抢到商品后有没有在规定时间内完成付款,如果没有在规定时间内完成付款,则取消订单,库存加1。如果完成付款,则生成最终订单,并同步到mysql数据库。
注:在秒杀结束到付款前都是在redis服务器中进行数据的运算,当秒杀结束后再将最终的数据同步到MySQL中。
领取专属 10元无门槛券
私享最新 技术干货