秒杀系统实现思路

Posted 码道小鑫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了秒杀系统实现思路相关的知识,希望对你有一定的参考价值。

当前浏览器不支持播放音乐或语音,请在微信或其他浏览器中播放

秒杀系统

秒杀系统主要要解决时间问题和库存问题。

1.需求分析

所谓“秒杀”,就是网络卖家发布一些超低价格的商品,所有买家在同一时间网上抢购的一种销售方式。通俗一点讲就是网络商家为促销等目的组织的网上限时抢购活动。由于商品价格低廉,往往一上架就被抢购一空,有时只用一秒钟。

秒杀商品通常有两种限制:库存限制、时间限制。

需求:

(1)商家提交秒杀商品申请,录入秒杀商品数据,主要包括:商品标题、原价、秒杀价、商品图片、介绍等信息

(2)运营商审核秒杀申请

(3)秒杀频道首页列出秒杀商品(进行中的)点击秒杀商品图片跳转到秒杀商品详细页。

(4)商品详细页显示秒杀商品信息,点击立即抢购实现秒杀下单,下单时扣减库存。当库存为0或不在活动期范围内时无法秒杀。

(6)当用户秒杀下单5分钟内未支付,取消预订单,调用微信支付的关闭订单接口,恢复库存。

2. 秒杀实现思路

秒杀技术实现核心思想是运用缓存减少数据库瞬间的访问压力!读取商品详细信息时运用缓存,当用户点击抢购时减少缓存中的库存数量,当库存数为0时或活动期结束时,同步到数据库。 产生的秒杀预订单也不会立刻写到数据库中,而是先写到缓存,当用户付款成功后再写入数据库。

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)当库存量为0时表示最后一个商品被抢

4)当库存为负数表示商品已经抢完,库存量不为负数时表示商品没有被抢完。

5)利用定时器不断扫描预订单,判断用户抢到商品后有没有在规定时间内完成付款,如果没有在规定时间内完成付款,则取消订单,库存加1。如果完成付款,则生成最终订单,并同步到mysql数据库。

注:在秒杀结束到付款前都是在redis服务器中进行数据的运算,当秒杀结束后再将最终的数据同步到MySQL中。


以上是关于秒杀系统实现思路的主要内容,如果未能解决你的问题,请参考以下文章

带你详细了解秒杀系统设计思路

C#怎么使用redis实现秒杀功能

电商秒杀系统设计思路和实现方法

秒杀系统

用Redis轻松实现秒杀系统

教你如何用 Redis 轻松实现秒杀系统的构思