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是一种内存级数据库,提供高速读写性能,但数据易失,它支持三种持久化方式:RDB(快照持久化)、AOF(追加文件持久化)和混合持久化,RDB通过快照将数据保存到磁盘,AOF记录所有写操作命令,混合持久化结合两者优点
    2025-01-01
  • 一文详解如何停止/重启/启动Redis服务

    一文详解如何停止/重启/启动Redis服务

    Redis是当前比较热门的NOSQL系统之一,它是一个key-value存储系统,这篇文章主要给大家介绍了关于如何停止/重启/启动Redis服务的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-03-03
  • 使用Redis实现JWT令牌主动失效机制

    使用Redis实现JWT令牌主动失效机制

    JWT是一种轻量级的身份验证和授权机制,它是一种 JSON 格式的数据串,通常用于客户端和服务端之间的单点登录(Single Sign-On, SSO)场景,本文给大家介绍了如何使用Redis来实现JWT令牌主动失效机制,需要的朋友可以参考下
    2024-08-08
  • Redis 持久化 RDB 与 AOF的执行过程

    Redis 持久化 RDB 与 AOF的执行过程

    本文给大家记录Redis 持久化RDB 与 AOF的执行过程与配置,通过内部触发 RDB 场景分析Redis 持久化 RDB的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-11-11
  • Redis分布式锁如何自动续期的实现

    Redis分布式锁如何自动续期的实现

    本文主要介绍了Redis分布式锁如何自动续期的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • Redis中Hash从使用过程到原理说明

    Redis中Hash从使用过程到原理说明

    Redis Hash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化性能,适用于购物车、计数器等场景
    2025-09-09
  • Redis中big keys发现与解决过程

    Redis中big keys发现与解决过程

    文章从bigkeys的定义、产生原因、危害、如何发现以及处理方法等方面详细介绍了Redis中bigkeys的问题,bigkeys会导致请求响应慢、网络卡顿、数据丢失等问题,需要通过异步删除、拆分key等方法进行处理
    2026-04-04
  • Redis超详细讲解高可用主从复制基础与哨兵模式方案

    Redis超详细讲解高可用主从复制基础与哨兵模式方案

    Redis因为其高性能和易用性在我们后端的服务中发挥了巨大的作用,并且很多重要功能的实现都会依赖redis,本篇我们来了解Redis高可用主从复制与哨兵模式
    2022-04-04
  • Redis设置database不生效的解决方案

    Redis设置database不生效的解决方案

    最近在做redis缓存设置的时候,发现即使已经设置了database, 但是存数据的时候还是用的默认0数据库,所以本文就给大家介绍了Redis设置database不生效的解决方案,需要的朋友可以参考下
    2023-08-08
  • redis 哨兵集群搭建的实现

    redis 哨兵集群搭建的实现

    本文主要介绍了redis 哨兵集群搭建的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08

最新评论