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的层面上实现对接口的拦截,以及对拦截的数据和接口实现锁的处理和释放。


数据运维技术 » Redis锁下的切面执行,按部就班(redis锁切面执行顺序)