轻量级秒杀系统的设计与实现
需求
在秒杀活动中,在指定的时间,只有少量的商品,于是短时间内会有大量的用户进行抢购。
分析
一般来说,被秒杀的商品都是一些稀有的东西,或者打折非常厉害、用来促销的商品,不希望被大量的得到。于是,我们得到最重要的一点就是不能超发,也不能一个人同时刷到两个。
实现
正常情况下客户端也有很多方式去拦截用户的请求,例如用户对一个按钮进行频率限制,点击一次以后灰掉,过x秒以后才允许下一次点击。这部分内容不在今天的讨论范围内。
有兴趣可以去看看litten同学写的文章 ==>反击爬虫,前端工程师的脑洞可以有多大?<==
这里我们只讨论服务层的实现。
核心组件,队列
现在系统一般都是分布式部署的,因此不能使用本地的队列。于是我们想到的组件就是Redis。
Redis是轻量级的kv存储系统,具有速度快,单线程的特点。
正是因为有了单线程的特点,无论redis连了多少个客户端,总是有先后顺序的,预先定义好队列的长度,这个长度就是抢购商品的数量。
最终实现
1 | # 首先从队列里面取出一个值 |