高并发Java秒杀系统优化(三)--接口限流防刷

 

如何实现接口限流防刷

有了对用户的访问进行一定的限制,就可以减轻服务器压力。例如通过访问次数的限制就是一种限流防刷的手段。即限制用户在一定的时间间隔内对接口的访问次数。

实现思路:对接口限流

一般来讲如果使用计时器来做这个功能,实现起来比较复杂。在这里,我们可以充分利用redis中的key-value过期机制来完成。

在redis中存储一个用于记录访问次数的变量,在过期时间内被继续访问,则次数变量加1,如果在过期时间内访问次数超出限制,则返回“频繁提交提示用户”。过期时间到了之后,将该变量删除。

因为可能需要对很多接口进行限流防刷操作,如果对每一个接口都实现一遍限流防刷,则会导致代码过度冗余,因此,可以定义一个方法拦截器@AccessInterceptor拦截用户对接口的请求,统一对拦截限流逻辑处理,这样可以有效地减少代码的冗余。针对需要拦截请求的接口,添加注解@AccessLimit即可。

接口限流

记录用户每次访问某接口的次数,并设置到缓存,并设置有效期,在x 秒内允许访问y次。

1、为了测试,我们设置5秒中内有效,5秒钟访问5次,超过5次直接返回“操作太频繁”

第一次与第二次间隔5秒以上,redis缓存已过期,又重新计算

2、MiaoshaController

在获取秒杀地址接口中增加限制,位于校验验证码之前

每次访问加1,超过5次返回“操作台频繁”

设置到redis,key : 当前获取秒杀地址请求的url + 用户id

 

但是,假如 秒杀接口、获取秒杀结果接口等也要限制,是不是都要写这样的逻辑,所以需要写一个通用的方法吗,比如注解+拦截器。

优化:注解+拦截器

1、注解效果如下:

2、新建AccessLimit 限流注解

x秒内允许访问最大次数,是否需要登录

3、新增一个拦截器

4、实现prehandle()方法,将上面限流的逻辑代码拷贝过来修改

注:这里也需要获取MiaoshaUser对象,而之前有写过一个通用的方法,直接拷贝过来

但是这样就会有重复的代码,所以再次优化:

上面获取到MiaoshaUser对象之后,再设置到一个ThreadLocal 本地变量中(多线程)

UserContext

之前的UserArgumentResolver 则直接调用UserContext.getUser即可

5、注册拦截器

整理:https://coding.imooc.com/class/168.html#Envir

注:上两节分别介绍了秒杀接口地址的隐藏、图形数学公式验证码。

史上最强Tomcat8性能优化

阿里巴巴为什么能抗住90秒100亿?--服务端高并发分布式架构演进之路

B2B电商平台--ChinaPay银联电子支付功能

学会Zookeeper分布式锁,让面试官对你刮目相看

SpringCloud电商秒杀微服务-Redisson分布式锁方案

查看更多好文,进入公众号--撩我--往期精彩

一只 有深度 有灵魂 的公众号0.0

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值