Redis锁下的切面执行,按部就班(redis锁切面执行顺序)
在当今高并发处理场景中,为了防止并发冲突,往往需要对需要并发执行的代码段进行排队处理,这便是引入了分布式锁的原因。在这种面对迗及高并发处理场景,为了保证数据安全,分布式系统中采用分布式锁来保护关键数据和业务逻辑的安全,最常见的做法是使用redis锁来分布式地控制数据的访问。既然分布式锁在多系统开发中已变得不可缺少,那必然也需要有一种统一的处理机制,将其加载到系统的每个接口中去。下面我们就从实现的角度,介绍一种基于spring的AOP的redis锁注解,轻松实现针对数据、接口安全的应用程序。
对于业务场景,大部分情况都是一个接口一个关键数据,比如说一个接口中有个订单号,而AOP只要在拦截器上加上针对唯一性的行为,这样子就可以省去写重复代码量且易于维护,下面直接给出针对redis锁的AOP配置:
“`java
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RedisLock {
//锁的持有时间,单位为窜,默认值为一分钟
int expire() default 60;
//锁的尝试时间,单位为窜, 默认值为5秒
int tryTimeout() default 5;
//锁的参数,支持SpEL表达式
String param() default “”;
}
如上只是定义了一个简单的AOP,它只在有RedisLock注解放进去的业务代码中插入分布式锁的一些配置。而redis锁的实现,主要是对以上注解的指定参数进行处理,确定Redis的Key,并且在锁的时候设定过期时间,这样子就可以保证即使在操作失败时锁也会释放 ->```java
@After("@annotation(redisLock)")public void doAfter(RedisLock redisLock){
//根据传入的param参数,解析为Redis的key,然后尝试锁定相关资源 String key = parseRedisKey(redisLock);
try { lock.lock(key, redisLock.expire, redisLock.tryTimeout);
} catch (Exception e) { // TODO 具体的失败处理逻辑
}}
@Around(“@annotation(redisLock)”)
public void doAround(ProceedingJoinPoint joinPoint, RedisLock redisLock) throws Throwable{
String key = parseRedisKey(redisLock);
try {
//执行子线程操作,
joinPoint.proceed();
} catch (Exception e) {
//
} finally {
//解除锁
lock.unlock(key);
}
}
最后也就是总结了一下,想要在spring应用程序当中实现redis锁注解,基本上就是实现对上面提到的RedisLock注解数据的解析及处理,并在AOP的层面上实现对接口的拦截,以及对拦截的数据和接口实现锁的处理和释放。
相关文章