redisson分布式锁实现方式
2023-12-25 16:45:50
在当下分布式开发中,分布式锁的应用非常频繁,也非常重要,所以下面根据我们实际操作,实现一下redisson的分布式锁。
1、引入maven包
<!--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
public interface DistributedLockFactory {
/**
* 根据key获取分布式锁
*/
DistributedLock getDistributedLock(String key);
}
基于Redisson的分布式锁实现服务
@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
@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);
}
}
配置文件
# redisson
distributed.lock.type=redisson
#single/cluster
redis.arrange.type=single
文章来源:https://blog.csdn.net/daohangtaiqian/article/details/135202014
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!