需求

在秒杀活动中,在指定的时间,只有少量的商品,于是短时间内会有大量的用户进行抢购。

分析

一般来说,被秒杀的商品都是一些稀有的东西,或者打折非常厉害、用来促销的商品,不希望被大量的得到。于是,我们得到最重要的一点就是不能超发,也不能一个人同时刷到两个。

实现

正常情况下客户端也有很多方式去拦截用户的请求,例如用户对一个按钮进行频率限制,点击一次以后灰掉,过x秒以后才允许下一次点击。这部分内容不在今天的讨论范围内。
有兴趣可以去看看litten同学写的文章 ==>反击爬虫,前端工程师的脑洞可以有多大?<==

这里我们只讨论服务层的实现。

核心组件,队列

现在系统一般都是分布式部署的,因此不能使用本地的队列。于是我们想到的组件就是Redis。

Redis是轻量级的kv存储系统,具有速度快,单线程的特点。

正是因为有了单线程的特点,无论redis连了多少个客户端,总是有先后顺序的,预先定义好队列的长度,这个长度就是抢购商品的数量。

最终实现

1
2
3
4
5
# 首先从队列里面取出一个值
lpop queue_key

# 只有拿到了值,才有资格进行购买操作
do buy something # 减扣金币,存入背包