秒杀系统的设计与实现(限时抢购抢救接口单用户限制实现)

Posted 雾晴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了秒杀系统的设计与实现(限时抢购抢救接口单用户限制实现)相关的知识,希望对你有一定的参考价值。

上面,完成了防止超卖商品和抢购接口的限流,已经能够防止大流量把我们的服务器直接搞炸,要开始关心一些细节问题。现在设计的系统还有一些问题:
我们应该在一定的时间内执行秒杀处理,不能再任意时间都接受秒杀请求。如何加入时间验证?
对于稍微懂点电脑的,又会动歪脑筋的人来说开始通过抓包方式获取我们的接口地址。然后通过脚本进行抢购怎么办?
秒杀开始之后如何限制单个用户的请求频率,即单位时间内限制访问次数?

限时抢购实现

使用redis来记录秒杀时间,,对秒杀过期的请求进行拒绝处理!!

一般在真实环境中,都会通过定时任务,在秒杀获取开始的前,将数据库中要秒杀的商品添加到redis中, 下面我们手动模拟

这里我们使用String类型 以kill + 商品id作为key 以商品id作为value,设置180秒超时(可随意设置时间)
127.0.0.1:6379> set kill1 1 EX 180

抢购中加入时间控制
整合当前项目操作redis服务,这里使用spring-boot-starter-data-redis操作redis,引入依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

修改yml配置

spring.redis.port=6379
spring.redis.host=localhost
spring.redis.database=0

通过redis控制抢购超时的请求

秒杀接口隐藏

  • 每次点击秒杀按钮,先从服务器获取一个秒杀验证值(接口内判断是否到秒杀时间)。
  • Redis以缓存用户ID和商品ID为Key,秒杀地址为Value缓存验证值
  • 用户请求秒杀商品的时候,要带上秒杀验证值进行校验。


这样可以起到一定的作用

单用户次数限制

其实很简单的就能想到用redis给每个用户做访问统计,甚至是带上商品id,对单个商品做访问统计,这都是可行的。
我们先实现一个对用户的访问频率限制,我们在用户申请下单时,检查用户的访问次数,超过访问次数,则不让他下单!

以上是关于秒杀系统的设计与实现(限时抢购抢救接口单用户限制实现)的主要内容,如果未能解决你的问题,请参考以下文章

使用RateLimiter完成简单的大流量限流,抢购秒杀限流

高并发高性能场景(抢购秒杀抢票限时竞答)解决方案

电商网站秒杀与抢购的系统架构

秒杀系统实现思路

秒杀系统实战| 缓存与数据库双写问题的争议

Web系统大规模并发——电商秒杀与抢购