• 后端使用aop和redis实现防抖


    在公司的代码开发中遇到了,快速点击就会重复提交的bug,刚好最近在优化代码于是想着在后端实现防抖

    1.整体思路

    在这里插入图片描述

    2.创建防抖的注解

    防抖我一般放在存储方法上,在程序运行时使用,于是我的防抖注解是method类型

    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface AntiShake {
    
        /**
         * 默认的防抖时间ms
         * @return
         */
        long value() default 1000;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3. 接口防抖aop

    @annotation(com.hy.district.annotation.AntiShake)
    就是定位到我加了AntiShake的方法上,只有这些方法才走aop防抖
    redisUtil是redis的工具类主要是对存储与获取进行封装,百度一下很多

    /**
     * 接口防抖aop
     */
    @Aspect
    @Component
    @Slf4j
    public class AntiShakeAOP {
    
        @Autowired
        private RedisUtil redisUtil;
    
        @Around(value = "@annotation(com.hy.district.annotation.AntiShake)")
        public Object antiShake(ProceedingJoinPoint pjp) throws Throwable {
            // 获取调用方法的信息和签名信息
            MethodSignature signature = (MethodSignature) pjp.getSignature();
            // 获取方法
            Method method = signature.getMethod();
            // 获取注解中的参数
            AntiShake aAnnotation = method.getAnnotation(AntiShake.class);
            // 查询redis中是否存在对应关系
            String key = method.getName() + RedisUtil.prefix + SecurityUtils.getUserId();
            Boolean aBoolean = redisUtil.hasKey(key);
            log.error("redis是否有建===> {}", aBoolean);
            if (!aBoolean) {
                redisUtil.setCacheObject(key, aAnnotation.value(), aAnnotation.value(), TimeUnit.MILLISECONDS);
                return pjp.proceed();
            } else {
                log.error("请勿重复点击");
                return null;
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    4. 使用

    直接在要用的接口上加上就行了,可以自定义设置防抖时间,不设置就会使用你注解里面的默认时间

    
    @PostMapping("/addAssessmentObject")
        @ApiOperation(value = "存储", notes = "存储")
        @AntiShake(1000)
        public R<String> addAssessmentObject(@RequestBody @Validated TAssessmentObjectDTO tAssessmentObjectDTO) {
            return tAssessmentObjectService.addAssessmentObject(tAssessmentObjectDTO);
        }
      
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    学习C++语言可以适用于哪些方面
    Python笔记 · Python语言的“动态性”
    4、paxos协议
    C语言洛谷题目分享(10)最厉害的学生和明明的随机数
    python基于PHP+MySQL汽车展览会系统
    KMP 算法的一些理解
    谈谈我的「数字文具盒」 - 数字基建
    GCC Rust获批将被纳入主线代码库,或将于GCC 13中与大家见面
    arcgis终结时间表
    2022速卖通官方披露;婚纱服饰品类策略及机会品类推荐
  • 原文地址:https://blog.csdn.net/biancheng4/article/details/133772186