抢购商品用什么方法比较快


时光如梭,转瞬即逝,已过去两周。此刻是时候回顾并继续我们的技术分享了,以免被各位网友的催促所困扰。

本文是秒杀系统的系列第三篇,我们将通过实际代码讲解,帮助大家理解秒杀系统设计的关键点,并上手实际项目。

本篇主要讲解秒杀系统中关于抢购(下单)接口相关的单用户防刷措施,主要涉及两块内容:

1. 抢购接口隐藏

2. 单用户限制频率(单位时间内限制访问次数)

这两项措施在各类系统中都有应用,不仅仅局限于秒杀系统。今天的内容也是相当通用的。

我已经制作了一张流程图,详细描述了我们目前实现的秒杀接口下单流程。以下是具体流程:

1. 零基础上手秒杀系统(一):防止超卖

2. 零基础上手秒杀系统(二):令牌桶限流 + 再谈超卖

3. 零基础上手秒杀系统(三):抢购接口隐藏 + 单用户限制频率(本篇)

4. 零基础上手秒杀系统:使用Redis缓存热点数据

5. 零基础上手秒杀系统:消息队列异步处理订单

...

对于那些希望学习更多但感到迷茫的朋友们,不必担心,我已将相关项目的代码和资料放在了Github上,地址如下:

[Github链接](/qqxx6661/miaosha)

在前两篇文章中,我们讨论了如何防止超卖和如何对抢购接口进行限流。这些措施可以帮助我们防止服务器因大流量而崩溃。我们将关注一些更细致的点,例如如何保护我们的接口不被恶意。

对于具有一定电脑知识并想搞点“小动作”的人来说,他们可以通过浏览器控制台或者抓包工具来获取我们的抢购接口链接。一旦他们获得了这个链接,只需编写一些简单的爬虫代码,就可以绕过正常的抢购流程,直接在代码中请求我们的接口,完成下单。这就是所谓的“薅羊毛”行为。

为了解决这个问题,我们需要将抢购接口进行隐藏,也就是接口加盐。具体做法如下:

1. 用户点击秒杀按钮后,先从服务器获取一个秒杀验证值。

2. Redis以缓存用户ID和商品ID为Key,秒杀地址为Value缓存验证值。

3. 用户请求秒杀商品的时候,要带上秒杀验证值进行校验。

这种做法并不能完全防止恶意,但可以增加的难度。我们还需要在访问接口的时间上对用户进行限制,并可以通过在验证值接口增加更复杂的逻辑来进一步拉平普通用户和坏蛋们的下单时刻。

下面我们将通过代码实现一种简单的加盐接口。该项目将使用之前创建的stock表、stockOrder订单表和新的用户表,并在其中增加两个新的接口:获取验证值接口和携带验证值下单接口。具体实现过程涉及UserService、Controller等关键部分的代码编写和解释。这里只做简要介绍,详细代码请参考Github项目。

联系方式及主要关注方向:

后端开发技术、数据安全、物联网、边缘计算等方向的问题欢迎交流。

Github:@qqxx6661(项目代码托管)

CSDN、知乎、简书、掘金等平台账号(同步分享技术文章)