防抖(Debounce)和重复提交的解决方案:@NoRepeatSubmitAopByRedis

我深有体会,随着项目的发展和用户数量的增加,系统性能逐渐下降。原因之一就是频繁点击操作或接口请求过载导致的系统负荷过重。

这时,防抖(Debounce)这个设计模式就闪现在我的脑海里了。但是,我们还需要解决另一个问题:重复提交的问题。用户在短时间内连续点击同一按钮,导致多次执行相同的操作,这会带来很多后果,如数据丢失、接口请求过载等。

解决方案:@NoRepeatSubmitAopByRedis

为了解决这些问题,我设计了一个注解 @NoRepeatSubmitAopByRedis。这个注解可以帮助我们实现防抖和重复提交的功能。

依赖包

首先,我们需要添加以下依赖包:

 

<!-- redis -->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.5.0</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>

Redis配置

然后,我们需要配置Redis:

 

@Configuration
public class RedisConfig {
    
    @Bean
    public JedisConnectionFactory jedisConnectionFactory() {
        JedisConnectionFactory factory = new JedisConnectionFactory();
        factory.setHostName("127.0.0.1");
        factory.setPort(6379);
        return factory;
    }
}

定义注解 @NoRepeatSubmitAopByRedis

接下来,我们定义注解 @NoRepeatSubmitAopByRedis

 

// 定义一个防抖函数
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NoRepeatSubmitAopByRedis {
    
    // 时间粒度,秒级别
    int timeUnit() default 5;
}

AOP切面配置

然后,我们需要配置AOP切面:

 

// AOP切面配置
@Component
@Aspect
public class RepeatSubmitAspect {

    @Before("@annotation(noRepeatSubmit)")
    public void doBefore(JoinPoint joinPoint, NoRepeatSubmitAopByRedis noRepeatSubmit) {
        // 执行业务操作前,获取当前时间戳
        Long currentTime = System.currentTimeMillis();
        
        // 获取redis模板
        RedisTemplate redisTemplate = RedisTemplateUtils.getRedisTemplate();
        
        // key:接口名+时间粒度
        String key = joinPoint.getTarget().getClass() + ":" + noRepeatSubmit.timeUnit();
        
        // 判断是否重复提交
        if (redisTemplate.opsForSet().isMember(key, currentTime)) {
            // 重复提交,抛出自定义异常
            throw new RepeatSubmitException("接口已被重复提交");
        } else {
            // 第一次提交,添加到redis集合中
            redisTemplate.opsForSet().add(key, currentTime);
        }
    }
    
}

自定义异常

最后,我们需要定义一个自定义异常:

 

// 自定义异常
public class RepeatSubmitException extends RuntimeException {
    
    public RepeatSubmitException(String message) {
        super(message);
    }
}

Redis模板工具类

然后,我们需要配置Redis模板工具类:

 

// Redis模板工具类
@Component
public class RedisTemplateUtils {

    @Autowired
    private RedisTemplate redisTemplate;
    
    public RedisTemplate getRedisTemplate() {
        return redisTemplate;
    }
}

结论

通过使用 @NoRepeatSubmitAopByRedis 注解,我们可以很容易地实现防抖和重复提交的功能。这个注解可以帮助我们提高系统性能和安全性。

总结

在本文中,我们提到了防抖和重复提交的问题,以及如何使用 @NoRepeatSubmitAopByRedis 注解来解决这些问题。我们希望通过这篇文章,读者可以更好地理解这些概念,并且能够应用到自己的项目中。

 

 

 

 

 

 


来源: 互联网
本文观点不代表源码解析立场,不承担法律责任,文章及观点也不构成任何投资意见。

赞 ()

相关推荐

发表回复

评论列表

点击查看更多

    联系我们

    在线咨询: QQ交谈

    微信:13450247865

    邮件:451255340#qq.com

    工作时间:周一至周五,9:30-18:30,节假日休息

    微信