注解实现redis锁

本文介绍了如何基于切面编程和Redisson实现注解式的分布式锁。通过在方法上添加自定义注解`RedisLock`,设置锁的键和过期时间,然后在切面中处理加锁和解锁逻辑,实现并发控制。当尝试获取锁失败时,会立即返回错误信息,确保页面操作的独占性。此外,还提供了依赖的Redisson客户端库版本和使用示例。
摘要由CSDN通过智能技术生成

原理:基于切面编程实现通过注解的方式实现redis锁

代码如下:

依赖:

<dependency>
   <groupId>org.redisson</groupId>
   <artifactId>redisson</artifactId>
   <version>3.7.3</version>
</dependency>

注解代码

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface RedisLock {

    /**
     * 集合名
     * @return
     */
    String key();

    /**
     * 锁名
     *
     * @return
     */
    String lockName();

    long expire() default 1800L;

    TimeUnit timeUnit() default TimeUnit.SECONDS;
}

切面类,其中的BusinessException为自定义异常类,可以自己实现

@Aspect
@Component
public class RedisLockAspect {

    @Autowired
    private RedissonClient redissonClient;

    private static final String REDIS_PREFIX = "redisson_lock:";

    @Around("@annotation(redisLock)")
    public Object around(ProceedingJoinPoint joinPoint, RedisLock redisLock) {
        String key = redisLock.key();
        String lockName = redisLock.lockName();
        RLock rLock = redissonClient.getLock(REDIS_PREFIX + lockName + ":" + key);
        rLock.expire(redisLock.expire(), redisLock.timeUnit());
        boolean b = false;
        try {
            //拿不到锁立即返回
            b = rLock.tryLock(0, TimeUnit.SECONDS);
            if (b) {
                return joinPoint.proceed();
            } else {
                throw new BusinessException("当前页面有人正在进行操作,请稍后重试...");
            }
        } catch (BusinessException e) {
            throw new BusinessException(e.getErrorMessage());
        } catch (Throwable e) {
            throw new BusinessException("当前页面有人正在进行操作,请稍后重试...");
        } finally {
            //释放锁
            if (b) {
                rLock.unlock();
            }
        }
    }
}

使用方法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值