在当下分布式开发中,分布式锁的应用非常频繁,也非常重要,所以下面根据我们实际操作,实现一下redisson的分布式锁。
1、引入maven包
powershell
<!--redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.16.3</version>
</dependency>
2、实现
创建获取分布式锁的工厂类interface
java
public interface DistributedLockFactory {
/**
* 根据key获取分布式锁
*/
DistributedLock getDistributedLock(String key);
}
基于Redisson的分布式锁实现服务
powershell
@Component
public class RedissonLockFactory implements DistributedLockFactory {
private final Logger logger = LoggerFactory.getLogger(RedissonLockFactory.class);
@Autowired
private RedissonClient redissonClient;
@Override
public DistributedLock getDistributedLock(String key) {
RLock rLock = redissonClient.getLock(key);
return new DistributedLock() {
@Override
public boolean tryLock(long waitTime, long leaseTime, TimeUnit unit) throws InterruptedException {
boolean isLockSuccess = rLock.tryLock(waitTime, leaseTime, unit);
logger.info("{} get lock result:{}", key, isLockSuccess);
return isLockSuccess;
}
@Override
public void lock(long leaseTime, TimeUnit unit) {
rLock.lock(leaseTime, unit);
}
@Override
public void unlock() {
if (isLocked() && isHeldByCurrentThread()) {
rLock.unlock();
}
}
@Override
public boolean isLocked() {
return rLock.isLocked();
}
@Override
public boolean isHeldByThread(long threadId) {
return rLock.isHeldByThread(threadId);
}
@Override
public boolean isHeldByCurrentThread() {
return rLock.isHeldByCurrentThread();
}
};
}
}
创建RedissonConfig配置类
下面可以设置配置文件 去配置单节点还是集群节点实例化RedissonClient
java
@Configuration
@ConditionalOnProperty(name = "distributed.lock.type", havingValue = "redisson")
public class RedissonConfig {
@Value("${spring.redis.address}")
private String redisAddress;
@Bean(name = "redissonClient")
@ConditionalOnProperty(name = "redis.arrange.type", havingValue = "single")
public RedissonClient singleRedissonClient() {
Config config = new Config();
config.useSingleServer().setAddress(redisAddress).setDatabase(0);
return Redisson.create(config);
}
@Bean(name = "redissonClient")
@ConditionalOnProperty(name = "redis.arrange.type", havingValue = "cluster")
public RedissonClient clusterRedissonClient(){
Config config = new Config();
ClusterServersConfig clusterServersConfig = config.useClusterServers();
clusterServersConfig.setNodeAddresses(Arrays.asList(redisAddress));
return Redisson.create(config);
}
}
配置文件
powershell
# redisson
distributed.lock.type=redisson
#single/cluster
redis.arrange.type=single