前言
由于项目中需要使用到分布式锁,虽然分布式锁的实现有很多方法,例如,使用数据库、zookeeper、redis,以前我也写过这样的分享文章
虽然可以手写分布式锁,但还是比较复杂的,代码量比较到,由于现在已经有了实现分布式锁的jar包了,例如,redisson就是了,没必要自己手写那么复杂,还是站在前人的肩膀上吧
项目环境
本项目是基于springcloudalibaba的项目,版本如下:
<spring-boot.version>2.2.10.RELEASE</spring-boot.version>
<spring-cloud.version>Hoxton.SR4</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.5.RELEASE</spring-cloud-alibaba.version>
redis使用哨兵模式的redis
引入依赖
首先得引入redisson得依赖
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.12.4</version>
</dependency>
编写redisson配置类
@Configuration
public class RedissonConfig {
@Value("${spring.redis.sentinel.master}")
private String mymaster;
@Value("${spring.redis.sentinel.nodes}")
private String nodes;
@Value("${spring.redis.password}")
private String password;
@Value("${spring.redis.database}")
private String databas;
@Bean
public RedissonClient redisson() {
Config config = new Config();
String [] adds=nodes.split(",");
for(int i=0;i<adds.length;i++){
adds[i]="redis://"+adds[i];
}
SentinelServersConfig serverConfig=config.useSentinelServers()
.addSentinelAddress(adds)
.setMasterName(mymaster);
if(StringUtils.isNotBlank(password)){
serverConfig.setPassword(password);
}
if(StringUtils.isNotBlank(databas)){
serverConfig.setDatabase(Integer.parseInt(databas));
}
return Redisson.create(config);
}
}
到这里,我们配置得redisson就完成了接下来就是使用了
使用分布式锁
首先,把客户端注入
@Autowired
private RedissonClient redissonClient;
然后,在代码中就可以使用分布式锁了,一般用法如下:
RLock lock = redissonClient.getLock("该锁的key");
try {
lock.lock();
该处为加锁的业务代码
} finally {
lock.unlock();
}