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("锁释放" );
}
}
- 稍复杂使用
多线程并发一般使用公平锁
//公平锁
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)
