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、编写切面,上锁解锁

    1. package com.jsy.config;
    2. import org.aspectj.lang.ProceedingJoinPoint;
    3. import org.aspectj.lang.annotation.Around;
    4. import org.aspectj.lang.annotation.Aspect;
    5. import org.aspectj.lang.reflect.MethodSignature;
    6. import org.redisson.Redisson;
    7. import org.redisson.api.RLock;
    8. import org.springframework.stereotype.Component;
    9. import javax.annotation.Resource;
    10. import java.lang.reflect.Method;
    11. import java.util.concurrent.TimeUnit;
    12. @Aspect
    13. @Component
    14. public class LockAdvice {
    15. @Resource
    16. private Redisson rc;
    17. @Around("execution(* *..service..*.*(..))&&@annotation(com.jsy.config.RidissonLock)")
    18. public Object lock(ProceedingJoinPoint pjp) {
    19. System.out.println("加锁成功");
    20. RLock lock = null;
    21. try {
    22. MethodSignature ms = (MethodSignature) pjp.getSignature();
    23. Method method = ms.getMethod();
    24. RidissonLock rl = method.getDeclaredAnnotation(RidissonLock.class);
    25. String className = pjp.getTarget().getClass().getName();//类的绝对路径
    26. String methodName = pjp.getSignature().getName(); //方法名
    27. lock = rc.getLock(className + ":" + methodName);
    28. boolean b = lock.tryLock(rl.time(), rl.lockTimeOut(), TimeUnit.SECONDS);
    29. if (b) {
    30. return pjp.proceed();
    31. }
    32. } catch (Throwable e) {
    33. e.printStackTrace();
    34. throw new RuntimeException(e);
    35. } finally {
    36. System.out.println("解锁成功");
    37. lock.unlock(); // 释放锁
    38. }
    39. return null;
    40. }
    41. }

    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;
        }