SpringBoot集成Redisson分布式锁
Redisson是Redis的集群分布式解决方案。
目录
pom.xml依赖配置
application.yml配置
Java 代码配置RedissonClient
测试验证Redis分布式锁
pom.xml依赖配置
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.14.0</version>
</dependency>
application.yml配置
####=======分布式REDIS配置===========
redisson:
# 是否开启分布式REDIS服务
enabled: true
# Redis服务地址 如果集群使用","进行分割
serverAddress: redis://192.168.1.111:6381
# redis访问密码
serverPassword: xxx
# 单例使用数据库示例
database: 1
Java 代码配置RedissonClient
package com.patrol.config.redis;
import lombok.Getter;
import lombok.Setter;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
/**
* @Copyright: 2019-2021
* @FileName: RedissonConfig.java
* @Author: PJL
* @Date: 2020/12/29 16:33
* @Description: Redisson分布式redis服务支持配置
*/
@Getter
@Setter
@Component
@ConfigurationProperties(prefix = "redisson")
@ConditionalOnProperty(name = "redisson.enabled",havingValue = "true")
public class RedissonConfig {
/**
* 服务地址(支持集群)
*/
String serverAddress;
/**
* 服务密码
*/
String serverPassword;
/**
* 单例数据库实例
*/
Integer database;
/**
* 初始化分布式客户端对象
* @return
*/
@Bean("redisForDistribution")
public RedissonClient redissonClient(){
String splitChar = ",";
String[] serverAddressArr = serverAddress.split(splitChar);
Config config = new Config();
if (serverAddressArr.length == 1) {
//单例redis
config.useSingleServer()
.setAddress(this.getServerAddress())
.setDatabase(this.getDatabase())
.setPassword(this.getServerPassword());
} else {
//集群redis
config.useClusterServers()
.addNodeAddress(serverAddressArr)
.setPassword(this.getServerPassword());
}
return Redisson.create(config);
}
}
测试验证Redis分布式锁
@Slf4j
@SpringBootTest
class PatrolQualityServiceApplicationTests {
@Qualifier("redisForDistribution")
@Autowired
RedissonClient redissonClient;
/**
* 分布式锁测试
*/
@Test
public void initRedisSafe() {
String lockName = "lock-id";
RLock lock = redissonClient.getLock(lockName);
try {
//尝试获取锁 (最多尝试10秒,获取到后15秒后释放锁)
boolean isAcquireLock = lock.tryLock(10, 15, TimeUnit.SECONDS);
if (isAcquireLock) {
try {
log.info("初始化消息统计 --- 获取锁成功 lockName = " + lockName);
// 睡眠10s模拟业务操作
TimeUnit.SECONDS.sleep(10);
log.info("初始化消息统计 --- 初始化业务数据完成!");
} finally {
//释放锁 (在事务提交后才释放锁。保证其它事务在获取锁后能查询到数据,不会再进行初始化。)
lock.unlock();
log.info("初始化消息统计 --- 解锁成功!");
}
} else {
log.error("初始化消息统计 --- 获取锁失败 lockName = " + lockName);
throw new RuntimeException("系统异常");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行结果:
2020-12-29 18:31:37.166 [main] INFO c.p.q.PatrolQualityServiceApplicationTests | 初始化消息统计 --- 获取锁成功 lockName = lock-id
2020-12-29 18:31:49.749 [main] INFO c.p.q.PatrolQualityServiceApplicationTests | 初始化消息统计 --- 初始化业务数据完成!
2020-12-29 18:31:51.172 [main] INFO c.p.q.PatrolQualityServiceApplicationTests | 初始化消息统计 --- 解锁成功!
还没有评论,来说两句吧...