1、依赖
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.11.0</version>
</dependency>
2、实例
集群模式
/**
* redis工具
*/
@Slf4j
@Component
public class RedissonConfig {
/**
* 集群节点,多个逗号分隔
*/
@Value("${redis.cluster.nodes}")
private String nodes;
@Value("${redis.common.key}")
private String password;
@Bean
public RedissonClient redissonClient() {
final int processors = Runtime.getRuntime().availableProcessors() * 2;
Config config = new Config();
config.setThreads(processors)
.setNettyThreads(processors)
.useClusterServers()
.addNodeAddress(parseHostAndPort())
.setPassword(password);
return Redisson.create(config);
}
/**
* 解析节点配置
*/
private String[] parseHostAndPort() {
try {
List<String> nodeAddressList = new ArrayList<>();
String[] nodesArray = nodes.split(",");
for (String node : nodesArray) {
String[] ipAndPort = node.split(":");
nodeAddressList.add(String.format("redis://%s:%s", ipAndPort[0], ipAndPort[1]));
}
return nodeAddressList.toArray(new String[]{});
} catch (Exception e) {
log.error("parseHostAndPort:解析节点配置失败.error:", e);
}
return new String[]{};
}
}
哨兵模式
/**
* redis工具
*/
@Slf4j
@Component
public class RedissonConfig {
/**
* 哨兵模式主节点
*/
@Value("${spring.redis.search.sentinel.master}")
private String master;
/**
* 哨兵模式从节点,多个逗号分隔
*/
@Value("${spring.redis.search.sentinel.nodes}")
private String nodes;
@Value("${spring.redis.search.password}")
private String password;
@Value("${spring.redis.search.masterConnectionPoolSize:200}")
private Integer masterConnectionPoolSize;
@Value("${spring.redis.search.slaveConnectionPoolSize:200}")
private Integer slaveConnectionPoolSize;
@Bean
public RedissonClient redissonClient() {
Config config = new Config();
SentinelServersConfig sentinelServersConfig = config.useSentinelServers()
.addSentinelAddress(parseHostAndPort())
.setMasterName(master)
.setMasterConnectionPoolSize(masterConnectionPoolSize)
.setSlaveConnectionPoolSize(slaveConnectionPoolSize);
sentinelServersConfig.setPassword(password);
return Redisson.create(config);
}
/**
* 解析节点配置
*/
private String[] parseHostAndPort() {
try {
List<String> nodeAddressList = new ArrayList<>();
String[] nodesArray = nodes.split(",");
for (String node : nodesArray) {
String[] ipAndPort = node.split(":");
nodeAddressList.add(String.format("redis://%s:%s", ipAndPort[0], ipAndPort[1]));
}
return nodeAddressList.toArray(new String[]{});
} catch (Exception e) {
log.error("parseHostAndPort:解析节点配置失败.error:", e);
}
return new String[]{};
}
}
3、使用
public class RedissonLockTest {
@Resource
private RedissonClient redissonClient;
public void test(){
RLock rLock = redissonClient.getLock("test");
rLock.lock(10, TimeUnit.SECONDS);
try {
// do sth
} finally {
try {
rLock.unlock();
} catch (Exception e) {
log.warn("rLock.unlock() fail.taskKey = {}.error:{}", taskKey,e);
}
}
}
}
4、注意事项
排除netty包冲突。
假设项目中依赖了阿里云rocketmq的包,则需排除掉该包中的netty(此包中的netty版本低于redisson 3.11.0中依赖的netty版本)
<dependency>
<groupId>com.aliyun.openservices</groupId>
<artifactId>ons-client</artifactId>
<version>1.8.4.Final</version>
<exclusions>
<exclusion>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
</exclusion>
</exclusions>
</dependency>