Redis分布式锁Redisson使用简单介绍

Redis分布式锁Redisson使用简单介绍

一、配置引用

1.pom文件中引用jar包

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

2.代码配置文件

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Author Gooqeal
 * @Date: 2021/12/23 9:46
 * @Version 1.0
 */
@Configuration
public class RedissonConfig {

    @Value("${redis.master.name}")
    private String masterName;

    @Value("${redis.sentinel.ip1}")
    private String sentinelIp1;
    @Value("${redis.sentinel.ip2}")
    private String sentinelIp2;
    @Value("${redis.sentinel.ip3}")
    private String sentinelIp3;
    @Value("${redis.sentinel.port1}")
    private String port1;
    @Value("${redis.sentinel.port2}")
    private String port2;
    @Value("${redis.sentinel.port3}")
    private String port3;
    @Value("${redis.database}")
    private int dataBase;
    @Value("${redis.password}")
    private String password;

    @Bean
    public RedissonClient redissonClient(){
        Config config = new Config();
        config.useSentinelServers().setMasterName(masterName)
                .addSentinelAddress("redis://"+sentinelIp1+":"+port1)
                .addSentinelAddress("redis://"+sentinelIp2+":"+port2)
               .addSentinelAddress("redis://"+sentinelIp3+":"+port3).setPassword(password)
                .setDatabase(dataBase).setTimeout(3600);
        System.out.println("sentinelIp1 = " + sentinelIp1);
        return Redisson.create(config);
    }
}

说明:1.如果redis是受保护的SSL协议,redis://需替换成rediss://

2.支持多种redis连接模式,Cluster集群、单例、哨兵。示例使用哨兵模式redis,Cluster模式集群配置:

Config config = new Config();
config.useClusterServers().addNodeAddress("127.0.0.1:7000")
        .addNodeAddress("127.0.0.1:7001")
        .setPassword("password").setScanInterval(2000);

二、使用

1.直接注入

@Autowired
private RedissonClient redissonClient;

2.简单使用

一般适用单体应用,可重入锁

//锁住业务key
RLock lock = redissonClient.getLock("test");
//获取锁
lock.lock();
try {
    //执行业务逻辑
    System.out.println("业务逻辑执行开始" );
    for (int i = 0; i < 100; i++) {
        System.out.println("i = " + i);
    }
    System.out.println("业务逻辑执行结束" );
} catch (Exception e) {
    e.printStackTrace();
}finally {
    //释放锁
     if (lock.isLocked()){
         lock.unlock();
         System.out.println("锁释放" );
      }
}
  1. 稍复杂使用

多线程并发一般使用公平锁

//公平锁
RLock lock = redissonClient.getFairLock("test");
//获取锁 不需要unlock方法手动解锁,10秒钟自动解锁
lock.lock(10, TimeUnit.SECONDS);
//公平锁
RLock lock = redissonClient.getFairLock("test");
//尝试获取锁,30秒之后自动解锁,30秒一般根据业务处理耗时设置
boolean res = lock.tryLock(30, TimeUnit.SECONDS);
if (res){
    //业务逻辑处理
}
//tryLock需要手动解锁
lock.unlock();

4.分布式锁种类

可重入锁(Reentrant Lock)

公平锁(Fair Lock)

联锁(MultiLock)

红锁(RedLock)

读写锁(ReadWriteLock)

信号量(Semaphore)

可过期性信号量(PermitExpirableSemaphore)

闭锁(CountDownLatch)

经验分享 程序员 微信小程序 职场和发展