1、导入依赖

    1. <dependency>
    2. <groupId>org.redisson</groupId>
    3. <artifactId>redisson-spring-boot-starter</artifactId>
    4. <version>3.10.6</version>
    5. </dependency>
    6. <dependency>
    7. <groupId>org.redisson</groupId>
    8. <artifactId>redisson</artifactId>
    9. <version>3.6.1</version>
    10. </dependency>

    2、编写切面,上锁解锁

    package com.jsy.config;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.reflect.MethodSignature;
    import org.redisson.Redisson;
    import org.redisson.api.RLock;
    import org.springframework.stereotype.Component;
    
    import javax.annotation.Resource;
    import java.lang.reflect.Method;
    import java.util.concurrent.TimeUnit;
    
    @Aspect
    @Component
    public class LockAdvice {
    
        @Resource
        private Redisson rc;
    
        @Around("execution(* *..service..*.*(..))&&@annotation(com.jsy.config.RidissonLock)")
        public Object lock(ProceedingJoinPoint pjp) {
            System.out.println("加锁成功");
            RLock lock = null;
            try {
                MethodSignature ms = (MethodSignature) pjp.getSignature();
                Method method = ms.getMethod();
                RidissonLock rl = method.getDeclaredAnnotation(RidissonLock.class);
                String className = pjp.getTarget().getClass().getName();//类的绝对路径
                String methodName = pjp.getSignature().getName();       //方法名
                lock = rc.getLock(className + ":" + methodName);
                boolean b = lock.tryLock(rl.time(), rl.lockTimeOut(), TimeUnit.SECONDS);
                if (b) {
                    return pjp.proceed();
                }
            } catch (Throwable e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            } finally {
                System.out.println("解锁成功");
                        lock.unlock(); // 释放锁
            }
            return null;
        }
    
    
    }
    

    3、自定义注解

    package com.jsy.config;
    
    import java.lang.annotation.*;
    
    
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface RidissonLock {
        // String lockKey();
        int time() default 20;
        int lockTimeOut() default 20;
    
        String start() default "";   //前缀
    
        String end() default "";     //后缀
    
        int index() default 0;       //索引
    
        String fileName() default ""; //字段名
    }
    

    4、注册bean

     @Bean
        public Redisson redisson(){
            Config config=new Config();
            config.useSingleServer().setAddress("redis://222.178.212.29:6379").setDatabase(11).setPassword("smart99--");
            RedissonClient redissonClient = Redisson.create(config);
            return (Redisson)redissonClient;
        }