使用注解方式实现redis分布式锁
前文
本文主要内容是通过注解的方式,引入redis分布式锁,来简化每个接口加分布式锁的操作步骤。
如何实现
本文的主要思路是采用切面的思想来处理。首先需要在需要加锁的接口上设置我们所开发的注解,而注解中要带一个参数,也就是实际的注解名称,以它作为redis中锁的key。这样当请求到来时,会进入到切面的程序逻辑中。在切面的逻辑中我们会对于redis中的该值进行判断及设置,也就是redis自带的setnx方法,当然在api中调用的方法可能不同。如果redis中不存在该key,则将数据写入。如果redis中已经存在了该key,则证明目前该锁已经被占用,需要给调用方进行占用信息的返回。另外,如果不同的接口需要共享这把锁,只需要设置相同的锁名称即可。如果不同接口采用不同的锁,则设置为不同的锁名称。另外,该注解正常来说是应用在接口名称上的,但同时也可以将其定义在普通方法之上,来实现对于方法的锁控制,其中的原理与上述原理一致,都是通过redis的key来进行锁状态的查询与分析。
实现代码
此处不进行完整代码的粘贴,实际就是通过切面aspect注解来实现,主要将redis的处理代码放在这里:
Boolean lock=multiTenantRedisUtils.initDatabase().opsForValue().setIfAbsent(lockKey,1);
if(lock){return proceedingJoinPoint.proceed();
}else{throw new RestApiException(ExceptionEnum.DATA_ACCESS_EXCEPTION.getErrorCode(), "当前接口已被锁定,请稍后再试");}
执行效果
并发的两次请求分别返回如下内容:{"success":true,"body":"lock1"}以及{"success":false,"error":{"code":"1002","message":"当前接口已被锁定,请稍后再试"}}。