代码拉取完成,页面将自动刷新
基于redis redisson的分布式锁spring-boot starter组件
支持Spring Boot 1.x 和 2.x
已发布到maven中央仓库,可直接引入依赖使用。
spring boot项目接入
1.添加lock starter组件依赖
# maven项目引入依赖 版本号请查看中央仓库最新版本
<dependency>
<groupId>com.mafgwo.common.distributed-lock</groupId>
<artifactId>common-distributed-lock-starter</artifactId>
<version>1.0.0</version>
</dependency>
# gradle项目引入依赖
compile('com.mafgwo.common.distributed-lock:common-distributed-lock-starter:1.0.0')
2.application.yaml的redis配置(可以单机、可以集群)与spring boot redis starter的配置保持一致如下
spring:
redis:
host: localhost
port: 6379
password: xxxx
3.在需要加分布式锁的方法上,添加注解@DistributedLock,如:
@Slf4j
@Service
public class TestServiceImpl implements TestService {
@DistributedLock(name = "test-lock", keys = {"#id"}, leaseTime = -1)
@Override
public void testLock(String id) {
try {
Thread.sleep(300000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info("test-lock finished");
}
}
@Slf4j
@Service
public class TestServiceImpl implements TestService {
@DistributedLock(name = "test-lock", keys = "#id", leaseTime = -1)
@Override
public void testLock(String id, @DistributedLockKey("name") UserVO user) {
try {
Thread.sleep(300000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info("test-lock finished");
}
}
配置参数说明
spring.redis.host : redis的host
spring.redis.port : redis的端口 默认是 6379
spring.redis.password : redis密码
spring.redis.database : redis数据索引 默认是0
spring.redis.cluster.nodes : redis集群配置 如 127.0.0.1:7000,127.0.0.1:7001,127.0.0.1:7002
spring.redis.host 和 spring.redis.cluster.nodes 选其一即可
# 为锁扩展的配置
spring.redis.waitTime : 获取锁最长阻塞时间(默认:60,单位:秒)
spring.redis.leaseTime: 已获取锁后自动释放时间(默认:60,单位:秒)
spring.redis.lockPrefix: 锁的前缀(默认:spring.application.name的值)
@DistributedLock注解参数说明
@DistributedLock可以标注四个参数,作用分别如下
name:lock的name,对应redis的key值。可不填,默认为:类名+方法名
keys:指定的业务key,只针对指定的业务keys加锁 可指定多个具体参考上面的示例
lockType:锁的类型,支持(可重入锁,公平锁,读写锁)。默认为:可重入锁
waitTime:获取锁最长等待时间。默认为:60s。同时也可通过spring.redis.waitTime统一配置
leaseTime:获得锁后,自动释放锁的时间。默认为:60s。同时也可通过spring.redis.leaseTime统一配置 当值为 -1 则会自动续租 直到业务完成 如果代码死锁则永远不会释放锁
lockTimeoutStrategy: 加锁超时的处理策略,可配置为不做处理、快速失败、阻塞等待的处理策略,默认策略为不做处理
customLockTimeoutStrategy: 自定义加锁超时的处理策略,需指定自定义处理的方法的方法名,并保持入参一致。
releaseTimeoutStrategy: 释放锁时,持有的锁已超时的处理策略,可配置为不做处理、快速失败的处理策略,默认策略为不做处理
customReleaseTimeoutStrategy: 自定义释放锁时,需指定自定义处理的方法的方法名,并保持入参一致。
关于redis锁的key的拼接说明
[前缀(默认为服务名)][锁名]-[keys的拼接,通过-拼接]
锁的几个使用示例如下
@Slf4j
@Service
public class TestServiceImpl implements TestService {
@DistributedLock(name = "test-lock", keys = {"#id"}, leaseTime = -1)
@Override
public void testLock(String id, UserVO user) {
try {
Thread.sleep(30000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info("test-lock finished");
}
/**
* 此方法的锁 与 上面 testLock方法的锁的key是同一个
* @param id
* @param user
*/
@DistributedLock(name = "test-lock", waitTime = 2, lockTimeoutStrategy = LockTimeoutStrategy.FAIL_FAST)
@Override
public void testLock2(@DistributedLockKey String id, UserVO user) {
this.testLock(id, user);
}
@DistributedLock(name = "test-lock3")
@Override
public void testLock3(String id, @DistributedLockKey("deptVO.id") UserVO user) {
this.testLock(id, user);
}
@DistributedLock(name = "test-lock4")
@Override
public void testLock4(String id, @DistributedLockKey("id") UserVO user) {
this.testLock(id, user);
}
}
加锁超时处理策略(LockTimeoutStrategy):
释放锁时超时处理策略(ReleaseTimeoutStrategy):
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。