我深有体会,随着项目的发展和用户数量的增加,系统性能逐渐下降。原因之一就是频繁点击操作或接口请求过载导致的系统负荷过重。
这时,防抖(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 注解来解决这些问题。我们希望通过这篇文章,读者可以更好地理解这些概念,并且能够应用到自己的项目中。
来源:
互联网
本文观点不代表源码解析立场,不承担法律责任,文章及观点也不构成任何投资意见。
评论列表