当前位置: 首页 > news >正文

使用Redis实现接口防抖

说明:实际开发中,我们在前端页面上点击了一个按钮,访问了一个接口,这时因为网络波动或者其他原因,页面上没有反应,用户可能会在短时间内再次点击一次或者用户以为没有点到,很快的又点了一次。导致短时间内发送了两个请求到后台,可能会导致数据重复添加。

为了避免短时间内对一个接口访问,我们可以通过AOP+自定义注解+Redis的方式,在接口上加一个自定义注解,然后通过AOP的前置通知,在Redis中存入一个有效期的值,当访问接口时这个值还未过期,则抛出异常,以此来避免短时间内对接口的方法。

实现

第一步:创建一个自定义注解,设置两个属性,一个是key,一个是这个key在Redis中的有效时间;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** 自定义注解*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LimitAccess {/*** 限制访问的key* @return*/String key();/*** 限制访问时间* @return*/int times();
}

第二步:创建对应的Aspect;

import com.hezy.annotation.LimitAccess;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;/*** AOP类(通知类)*/
@Component
@Aspect
public class LimitAspect {@Autowiredprivate RedisTemplate redisTemplate;@Pointcut("@annotation(com.hezy.annotation.LimitAccess)")public void pt(){};@Around("pt()")public Object aopAround(ProceedingJoinPoint pjp) throws Throwable {// 获取切入点上面的自定义注解Signature signature = pjp.getSignature();MethodSignature methodSignature = (MethodSignature) signature;// 获取方法上面的注解LimitAccess limitAccess = methodSignature.getMethod().getAnnotation(LimitAccess.class);// 获取注解上面的属性int limit = limitAccess.times();String key = limitAccess.key();// 根据key去找Redis中的值Object o = redisTemplate.opsForValue().get(key);// 如果不存在,说明是首次访问,存入Redis,过期时间为limitAccess中的timeif (o == null) {redisTemplate.opsForValue().set(key, "", limit, TimeUnit.SECONDS);// 执行切入点的方法return pjp.proceed();} else {// 如果存在,说明不是首次访问,抛出异常throw new RuntimeException("访问过于频繁");}}
}

第三步:在需要限制的接口上,加上这个注解,并设置key和限制访问时间,如下这个这个接口,设置key为set,实际开发中可以设置一个随机值,或者按照规则自定义设置,times为限制访问时间;

    @GetMapping("/limit")@LimitAccess(key = "limit", times = 10)public String limit() {return "success";}

演示

启动项目,访问该接口;

(首次访问,没得问题,同时在Redis中存入值)

在这里插入图片描述


(短时间内,连续访问,因为Redis中值未过期)

在这里插入图片描述

在这里插入图片描述


(10秒之后再访问,又可以了,Redis中的值过期了)

在这里插入图片描述

以上就是使用Redis实现接口防抖,避免短时间内连续访问接口。实际开发中,可以将异常设置为自定义异常。

相关文章:

  • 字节跳动开源基于SD1.5的 MagicAnimate 一张照片秒变真人舞蹈视频
  • 灰度发布专题---3、Nginx+Lua灰度发布
  • C++空类的那点事儿
  • 虾皮在线定价工具:知虾轻松制定有竞争力的价格策略
  • 一张网页截图,AI帮你写前端代码,前端窃喜,终于不用干体力活了
  • Python技术操作1-高效办公:将文本、图片和表格信息批量写入Word文档
  • QList简单使用
  • Web安全-初识SQL注入(一)
  • 关于 Python 的最全面试题
  • 矩阵的初等变换
  • Maven——Maven发展历程
  • MySQL查看和修改时区
  • 西安安泰——ATA-1220E宽带放大器
  • 【单片机】单片机裸机实现多任务调度
  • 质量小议35 -- SQL注入
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • HTML-表单
  • Java|序列化异常StreamCorruptedException的解决方法
  • JavaScript异步流程控制的前世今生
  • js
  • Node项目之评分系统(二)- 数据库设计
  • Redis 中的布隆过滤器
  • 程序员最讨厌的9句话,你可有补充?
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 简单数学运算程序(不定期更新)
  • 每天10道Java面试题,跟我走,offer有!
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (1)Android开发优化---------UI优化
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (附源码)ssm码农论坛 毕业设计 231126
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (新)网络工程师考点串讲与真题详解
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (转载)Linux网络编程入门
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .net 获取url的方法
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .net的socket示例
  • .Net环境下的缓存技术介绍
  • .NET值类型变量“活”在哪?
  • .NET中winform传递参数至Url并获得返回值或文件
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • @Mapper作用
  • [ Linux Audio 篇 ] 音频开发入门基础知识
  • []T 还是 []*T, 这是一个问题
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
  • [APUE]进程关系(下)