关联文章:
文章中使用的是spring-boot整合redisson,对单节点的redis进行锁操作
1.添加Redisson
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.14.0</version>
</dependency>
Redisson
存在和Spring-Boot
对应的版本,需要根据自己在项目中的Spring-Boot
版本引入对应的 redisson版本 。
例如:文本中使用的Spring-Boot
是2.2.x,那么根据对应需要使用redisson-spring-data-22
所以需要先排除上述引入3.14.0中的redisson-spring-data-23
,手动导入redisson-spring-data-22
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.14.0</version>
<exclusions>
<!-- 如果引入的对象是网关getway,则需要同时排除redisson中的spring-boot-starter-web组件-->
<!-- <exclusion>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-web</artifactId>-->
<!-- </exclusion>-->
<exclusion>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-data-23</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-data-22</artifactId>
<version>3.14.0</version>
</dependency>
2.添加yml配置项
spring:
cloud:
redis:
# 数据库索引
database: 0
# 地址
host: 127.0.0.1
# 端口
port: 6379
# 密码
password:
# 连接超时时间
timeout: 10s
lettuce:
pool:
# 连接池中的最小空闲连接
min-idle: 0
# 连接池中的最大空闲连接
max-idle: 8
# 连接池的最大数据库连接数
max-active: 8
# #连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1ms
redisson:
config: |
singleServerConfig:
idleConnectionTimeout: 10000
connectTimeout: 10000
timeout: 3000
retryAttempts: 3
retryInterval: 1500
subscriptionsPerConnection: 5
clientName: null
address: "redis://127.0.0.1:6379"
subscriptionConnectionMinimumIdleSize: 1
subscriptionConnectionPoolSize: 50
connectionMinimumIdleSize: 32
connectionPoolSize: 64
database: 0
dnsMonitoringInterval: 5000
threads: 16
nettyThreads: 32
transportMode: "NIO"
更加详细的配置项可以参考官方github
注意在config
配置项下首先是singleServerConfig
项,该项表示redis为单节点
3.启动redis
文章中使用docker的方式启动redis,安装好docker后使用命令
docker run -d -p 6379:6379 --name redis redis
4.测试redisson锁
下面测试中先尝试获取名为myLock
的锁,然后进行加锁操作,然后打印加所结果,之后模拟进行5s的业务逻辑操作后,释放锁。
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private RedissonClient redissonClient;
@RequestMapping("/getLock")
public void getLock() throws InterruptedException {
RLock rLock = redissonClient.getLock("myLock");
try {
boolean res = rLock.tryLock(0, TimeUnit.SECONDS);
if(res) {
System.out.println("getLock Success");
Thread.sleep(5000);
} else {
System.out.println("getLock failure");
}
rLock.unlock();
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
}
那么在加锁成功后我们可以进入redis容器使用命令查看锁
上图可以看到,加锁后默认会添加该锁的key
,并且拥有30s的过期时间,但是如果在某些特殊情况下,我们业务处理时间会超过该时间,那么Redisson
会怎么操作?
接着我们把线程睡眠时间改到60s或者更长,查看redis中锁的情况
如上图所示,Redisson
内部提供了一个监控锁的看门狗,它的作用是在Redisson
实例被关闭前,不断的延长锁的有效期。Redisson
在每间隔10s的时候会重新刷新该锁的过期时间到30s直到我们的业务处理完成。
关于锁,更加详细的信息可以查看官方github