redisson分布式锁实现方式

在当下分布式开发中,分布式锁的应用非常频繁,也非常重要,所以下面根据我们实际操作,实现一下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

相关推荐

  1. redisson分布式实现方式

    2023-12-26 08:52:02       65 阅读
  2. Redisson 实现分布式

    2023-12-26 08:52:02       49 阅读
  3. Redisson实现分布式

    2023-12-26 08:52:02       30 阅读
  4. redisson+aop实现分布式

    2023-12-26 08:52:02       58 阅读
  5. 比较 Redisson 和 Curator:分布式实现

    2023-12-26 08:52:02       56 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-26 08:52:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-26 08:52:02       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-26 08:52:02       82 阅读
  4. Python语言-面向对象

    2023-12-26 08:52:02       91 阅读

热门阅读

  1. Servlet技术之Cookie对象与HttpSession对象

    2023-12-26 08:52:02       43 阅读
  2. LLM调研笔记

    2023-12-26 08:52:02       57 阅读
  3. 遇到DDOS了怎么去防御

    2023-12-26 08:52:02       49 阅读
  4. 不同领域环境中的“组分分析”

    2023-12-26 08:52:02       53 阅读
  5. 嵌入式——RTC闹钟Alarm

    2023-12-26 08:52:02       52 阅读
  6. linux 可睡眠RCU

    2023-12-26 08:52:02       44 阅读
  7. Linux 定时器介绍

    2023-12-26 08:52:02       69 阅读
  8. 简单工厂、工厂方法、抽象工厂和策略模式

    2023-12-26 08:52:02       56 阅读
  9. .NET 8 网络改进

    2023-12-26 08:52:02       54 阅读
  10. llama大模型部署

    2023-12-26 08:52:02       48 阅读
  11. 贪心算法实现

    2023-12-26 08:52:02       53 阅读