不同 Redis 集群部署模式 Redisson 连接不同
Redis 常见四种部署模式:单机部署、主从模式部署、sentinel 部署模式、分片模式,针对不同场景一般选择不同的集群部署模式。而 redisson 单机部署针对不同的部署模式分别提供了不同的 API 以统一操作。
Redisson连接兼容多种部署模式
添加依赖
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.13.4</version>
</dependency>
yaml 配置
redis:
server:
model: 2 #1 表示单机,2 表示sentinel, 3表示cluster
key-prefix: ${spring.application.name}
singleton:
hostName: redis
port: ${port}
password: ${password}
sentinel:
nodes: ${ip1:port1},${ip2:port1},${ip3:port1}
master: redismaster
password: ${password}
cluster:
nodes: ${ip1:port1},${ip2:port1},${ip3:port1}
maxRedirects: 5
读取配置类
@Configuration
@ConfigurationProperties("redis.server")
@Data
public class RedisConfig {
private Integer model;
private String keyPrefix;
private RSingleton singleton;
private RSentinel sentinel;
private RCluster cluster;
@Data
static class RSingleton {
private String hostName;
private Integer port;
private String password;
}
@Data
static class RSentinel {
private String[] nodes;
private String master;
private String password;
}
@Data
static class RCluster {
private String[] nodes;
private Integer maxRedirects;
}
}
Redisson 支持 Redis 单机部署
// 单机模式
String address =
REDIS_PROTO + redisConfig.getSingleton().getHostName() + ":" + redisConfig.getSingleton()
.getPort();
SingleServerConfig serverConfig = config.useSingleServer();
serverConfig.setAddress(address);
if (!StringUtils.isEmpty(redisConfig.getSingleton().getPassword())) {
serverConfig.setPassword(redisConfig.getSingleton().getPassword());
}
return Redisson.create(config);
Redisson 支持 Redis sentinel 部署模式
String[] nodes = redisConfig.getSentinel().getNodes();
for (int i = 0; i < nodes.length; i++) {
nodes[i] = REDIS_PROTO + nodes[i];
}
SentinelServersConfig sentinelServersConfig = config.useSentinelServers();
sentinelServersConfig.setMasterName(redisConfig.getSentinel().getMaster());
sentinelServersConfig.addSentinelAddress(nodes);
if (StringUtils.isNotBlank(redisConfig.getSentinel().getPassword())) {
sentinelServersConfig.setPassword(redisConfig.getSentinel().getPassword());
}
return Redisson.create(config);
Redisson 支持 Redis 分片部署模式
String[] nodes = redisConfig.getCluster().getNodes();
for (int i = 0; i < nodes.length; i++) {
nodes[i] = REDIS_PROTO + nodes[i];
}
ClusterServersConfig clusterServersConfig = config.useClusterServers();
clusterServersConfig.addNodeAddress(nodes);
return Redisson.create(config);
多种模式支持
@Slf4j
@Component
public class RedissonConfig {
@Autowired
private RedisConfig redisConfig;
private static final String REDIS_PROTO = "redis://";
@Bean
public RedissonClient getRedissonClient() {
Config config = new Config();
if (redisConfig.getModel() == 2) {
// sentinel模式
String[] nodes = redisConfig.getSentinel().getNodes();
for (int i = 0; i < nodes.length; i++) {
nodes[i] = REDIS_PROTO + nodes[i];
}
SentinelServersConfig sentinelServersConfig = config.useSentinelServers();
sentinelServersConfig.setMasterName(redisConfig.getSentinel().getMaster());
sentinelServersConfig.addSentinelAddress(nodes);
if (StringUtils.isNotBlank(redisConfig.getSentinel().getPassword())) {
sentinelServersConfig.setPassword(redisConfig.getSentinel().getPassword());
}
return Redisson.create(config);
} else if (redisConfig.getModel() == 3) {
// 集群模式
String[] nodes = redisConfig.getCluster().getNodes();
for (int i = 0; i < nodes.length; i++) {
nodes[i] = REDIS_PROTO + nodes[i];
}
ClusterServersConfig clusterServersConfig = config.useClusterServers();
clusterServersConfig.addNodeAddress(nodes);
return Redisson.create(config);
} else {
// 单机模式
String address =
REDIS_PROTO + redisConfig.getSingleton().getHostName() + ":" + redisConfig.getSingleton()
.getPort();
SingleServerConfig serverConfig = config.useSingleServer();
serverConfig.setAddress(address);
if (!StringUtils.isEmpty(redisConfig.getSingleton().getPassword())) {
serverConfig.setPassword(redisConfig.getSingleton().getPassword());
}
return Redisson.create(config);
}
}
}
Redisson 分布式锁的使用
RestController
@RequestMapping("/redis")
@Slf4j
public class RedisLockController {
@Autowired
private RedissonClient redissonClient;
private String NAMESPACE = "node-install-app:";
@GetMapping("/lock/{clientid}")
public String lock(@PathVariable String clientid) throws InterruptedException {
String name = NAMESPACE + "hello";
RLock hello = redissonClient.getLock(name);
boolean b = hello.tryLock();
if (!b) {
log.info(clientid + "获取不到锁gg");
return clientid + "获取不到锁gg";
}
try {
log.info(clientid + "执行业务");
Thread.sleep(20000);
} finally {
hello.unlock();
}
log.info(clientid + "执行完成");
return clientid + "执行完成";
}
}