RedissonAutoConfiguration.java
package top.infra.cloudready.boot;
import lombok.extern.slf4j.Slf4j;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.redisson.config.SentinelServersConfig;
import org.redisson.config.SingleServerConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
@AutoConfigureAfter(RedisAutoConfiguration.class)
@ConditionalOnClass({Redisson.class, RedisTemplate.class})
@ConditionalOnProperty(name = {"spring.redis.host", "spring.redis.port"})
@Configuration
@Slf4j
public class RedissonAutoConfiguration {
private RedisProperties redisProperties;
@Value("${spring.redis.host:127.0.0.1}:${spring.redis.port:6379}")
private String address;
@Value("${spring.redis.database:0}")
private int database;
@Autowired(required = false)
public void setRedisProperties(final RedisProperties redisProperties) {
this.redisProperties = redisProperties;
}
public String getRedisAddress() {
//should add schema prefix "redis://" or "rediss://" for redisson version >= 3.7.0
final String schema = this.redisProperties.isSsl() ? "rediss://" : "redis://";
final String redisAddress = schema + this.redisProperties.getHost() + ":" + this.redisProperties.getPort();
log.info("redisAddress: {}", redisAddress);
return redisAddress;
}
private SentinelServersConfig sentinelServers(final Config config) {
final int redisDatabase = this.redisProperties.getDatabase();
final String redisPassword = this.redisProperties.getPassword();
final String redisSentinelMaster = this.redisProperties.getSentinel().getMaster();
final String[] redisSentinelNodes = this.redisProperties.getSentinel().getNodes().split(",");
SentinelServersConfig sentinelServersConfig = config.useSentinelServers();
sentinelServersConfig.setMasterName(redisSentinelMaster);
sentinelServersConfig.addSentinelAddress(redisSentinelNodes);
sentinelServersConfig.setDatabase(redisDatabase);
if (redisPassword != null) { //StringUtils.isNotBlank(redisPassword)
sentinelServersConfig.setPassword(redisPassword);
}
return sentinelServersConfig;
}
private SingleServerConfig singleServer(final Config config) {
final SingleServerConfig singleServerConfig = config.useSingleServer();
final String redisAddress = this.getRedisAddress();
final int redisDatabase = this.redisProperties.getDatabase();
final String redisPassword = this.redisProperties.getPassword();
singleServerConfig.setAddress(redisAddress).setDatabase(redisDatabase);
if (redisPassword != null) { //StringUtils.isNotBlank(redisPassword)
singleServerConfig.setPassword(redisPassword);
}
return singleServerConfig;
}
@Bean
public RedissonClient redissonClient() {
final Config config = new Config();
final boolean sentinel = this.redisProperties.getSentinel() != null;
if (sentinel) {
this.sentinelServers(config);
} else {
this.singleServer(config);
}
return Redisson.create(config);
}
}