10.redisson的使用

导入依赖

<dependency>
   <groupId>org.redisson</groupId>
   <artifactId>redisson</artifactId>
   <version>3.12.5</version>
</dependency>

创建配置类

package com.woniu.config;

import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
    public class RedissConfig {

    @Bean
    public RedissonClient redisson(){
        //单机模式
        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379").setDatabase(0);
        return  Redisson.create(config);
    }
    
       //集群模式
    @Bean
    public RedissonClient redisson(){
        Config config = new Config();
        //哨兵集群模式
        //config.useSentinelServers();
        //分片集群模式
        config.useClusterServers().addNodeAddress("redis://127.0.0.1:6379","redis://127.0.0.1:7001");
        return  Redisson.create(config);
    }
}

代码实现

 @Autowired
    private RedissonClient redisson;

    RLock lock = redisson.getLock("key");
    try {
        //加锁
        //20: 若该线程第一次没有获取到锁,那么20秒内会 每隔 20/3 的时间尝试获取锁,直到20s过后才走到下一行代码
        //5:  线程重入时间(自旋时间)
        boolean result = lock.tryLock(20, 5, TimeUnit.SECONDS);
        //boolean result = lock.tryLock(); 若使用无参方法,若该线程第一次没有获取到锁,直接走到下一行代码,默认锁时间30s
        if(!result){
            System.out.println("没有抢到锁!");
            return;
        }
        //======业务代码==================
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        //判断当前线程有没有加上锁(只有加上锁,才能释放锁,不然会报错),和是不是当前线程持有的锁
        if(lock.isLocked() && lock.isHeldByCurrentThread()) {
            lock.unlock(); //释放锁
        }
    }
posted @ 2025-05-29 21:34  icui4cu  阅读(28)  评论(0)    收藏  举报