
一,背景
在日常项目中经常会涉及到一些秒杀的情况,需要保证不超卖,库存等数据正确,这时候就需要引入分布式锁了。下面介绍基于redisson的分布式锁实现。
二,实现
1,引入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency><dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency><dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter</artifactId> <exclusions> <exclusion> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </exclusion> </exclusions> </dependency>
2,添加注解
import com.xxx.common.enumeration.LockFailStrategyEnum;
import com.xxx.common.enumeration.LockTypeEnum;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.concurrent.TimeUnit;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DistributedLock {
/**
* 用来区分场景,可以为空
*/
String prefix() default "";
/**
* 锁的key,支持SpEL表达式
*/
String key();
/**
* 锁的类型
*/
LockTypeEnum lockType() default LockTypeEnum.REENTRANT;
/**
* 获取锁的等待时间
* 等待获取锁请求时间,这个值为负数的话表示一致等待
*/
long waitTime() default -1;
/**
* 持有锁的时间(leaseTime)
* 自动释放锁的时间,这个值为负数表示需要手动释放锁
*/
long leaseTime() default -1;
/**
* 时间单位
*/
TimeUnit timeUnit() default TimeUnit.SECONDS;
/**
* 获取锁失败时的处理策略
*/
LockFailStrategyEnum failStrategy() default LockFailStrategyEnum.EXCEPTION;
/**
* 获取锁失败时抛出的异常信息
*/
String failMessage() default "获取分布式锁失败";
}

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



