Redis与自定义注解实现重复方式

 更新时间:2025年12月11日 14:12:59   作者:筱筱木  
文章介绍了如何使用Redis和自定义注解`SubmitLock`来防止重复提交,首先,创建了一个注解`SubmitLock`,然后在需要防止重复提交的方法上使用该注解,最后,通过一个controller测试验证了该功能的有效性

1、创建 SubmitLock 注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SubmitLock {
    String key() default "";
}

2、注解实现

    @Autowired
    public RedisUtils redisUtils;

    @Around("execution(* com.example.code_generation..*Controller.*(..)) && @annotation(lock)")
    public Object submitInterceptor(ProceedingJoinPoint pjp, SubmitLock lock) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

        HttpServletRequest request = attributes.getRequest();

        String uri = request.getRequestURI();
        MethodSignature signature = (MethodSignature) pjp.getSignature();
        Method method = signature.getMethod();
        //真实类名字
        String targetName = pjp.getTarget().getClass().getName();
        //真实方式
        String methodName = pjp.getSignature().getName();
        //所有的请求参数
        Object[] arguments = pjp.getArgs();
        Object[] args = new Object[arguments.length];
        SubmitLock localLock = method.getAnnotation(SubmitLock.class);
        String key = setKey(localLock.key(), pjp.getArgs());

        if (!StringUtils.isEmpty(key)) {
            if (redisUtils.get(key) != null) {
                log.error("请勿重复操作,uri = 【{}】", uri);
                return new RspData<>(BizCodeEnum.WARN, "请勿重复操作");
            }
            redisUtils.set(key,key,2);
        }
        Object result = null;
        try {
            result = pjp.proceed();
            return result;
        }catch (Throwable throwable){
            throw new RuntimeException("服务器异常");
        }finally {
            int order = 0;
            for (Object arg : arguments){
                if (arg instanceof ServletRequest || arg instanceof ServletResponse || arg instanceof MultipartFile){
                    continue;
                }
                args[order] = arg;
                order ++ ;
            }
            log.info("调用Controller方法返回结果,targetName = {}, methodName = {}, args = {}, result = {}",
                    targetName, methodName, args, result);
        }

    }


    private String setKey(String keyExpress, Object[] args) {
        if (null != args && args.length > 0) {
            keyExpress = keyExpress.replace("arg[0]", args[0].toString());
        }
        return keyExpress;
    }

3、controller 测试验证

    @SubmitLock(key = "getTest")
    @ApiOperation(value = "获取代办任务")
    @GetMapping("getTest")
    public Object getTest(@CurrentUser UserInfo userInfo) {
        
    }

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Redis与数据库数据一致性的原因及解决方案

    Redis与数据库数据一致性的原因及解决方案

    Redis作为一种高效的键值对存储系统,常用于缓存数据库减少IO操作,下面这篇文章主要介绍了Redis与数据库数据一致性的原因及解决方案,文中介绍的非常详细,需要的朋友可以参考下
    2025-04-04
  • 使用Redis有序集合实现IP归属地查询详解

    使用Redis有序集合实现IP归属地查询详解

    这篇文章主要介绍了使用Redis有序集合实现IP归属地查询,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • 关于Redis未授权访问的问题

    关于Redis未授权访问的问题

    这篇文章主要介绍了Redis未授权访问的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • Redis分布式锁实例分析讲解

    Redis分布式锁实例分析讲解

    分布式锁是控制分布式系统不同进程共同访问共享资源的一种锁的实现。如果不同的系统或同一个系统的不同主机之间共享了某个临界资源,往往需要互斥来防止彼此干扰,以保证一致性
    2022-12-12
  • Redis队列和阻塞队列的实现

    Redis队列和阻塞队列的实现

    本文主要介绍了Redis队列和阻塞队列的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-11-11
  • redis集群实现清理前缀相同的key

    redis集群实现清理前缀相同的key

    这篇文章主要介绍了redis集群实现清理前缀相同的key,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • 无法启动Redis打开redis-server闪退的问题解决办法

    无法启动Redis打开redis-server闪退的问题解决办法

    正常开启redis服务,首先要启动redis-server.exe,但是闪退,导致无法开启redis服务,这篇文章主要给大家介绍了关于无法启动Redis打开redis-server闪退问题的解决办法,需要的朋友可以参考下
    2024-07-07
  • Redis客户端连接机制的实现方案

    Redis客户端连接机制的实现方案

    本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下
    2025-07-07
  • Redis结合Lua脚本实现分布式锁详解

    Redis结合Lua脚本实现分布式锁详解

    Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 本文主要为大家介绍了Redis如何结合Lua脚本实现分布式锁,需要的可以参考下
    2024-02-02
  • 如何使用 redis 消息队列完成秒杀过期订单处理操作(二)

    如何使用 redis 消息队列完成秒杀过期订单处理操作(二)

    这篇文章主要介绍了如何使用 redis 消息队列完成秒杀过期订单处理操作,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-07-07

最新评论