如何解决无法使用 Spring 启动创建 Redis Sentinel Lettuce 多个连接
所以目前的要求是这样的。
问题只在于哨兵
我能够为数据库和缓存创建配置。 但是官方的 RedisSentinelConfiguration 类具有以下硬编码字段。 因此缓存连接也指向数据库连接。
@Configuration
public class RedisConfig {
@Value("${redis.type}")
String redisType;
@Value("${redis.commandTimeOut}")
Duration commandTimeOut;
@Bean(name = "jasyptStringEncryptor")
public StringEncryptor stringEncryptor() {
byte[] decodedBytes = Base64.getUrlDecoder().decode("aGVsbG8=");
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
encryptor.setPassword(new String(decodedBytes));
encryptor.setPoolSize(1);
encryptor.setProvider(new BouncyCastleProvider());
encryptor.setAlgorithm("PBEWITHSHA256AND256BITAES-CBC-BC");
encryptor.setKeyObtentionIterations(1000);
encryptor.setSaltGenerator(new org.jasypt.salt.RandomSaltGenerator());
return encryptor;
}
protected LettuceConnectionFactory clusterConnectionFactory(final RedisProperties redisProperties) {
RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration(redisProperties.getCluster().getNodes());
redisClusterConfiguration.setPassword(redisProperties.getpassword());
final LettuceClientConfiguration.LettuceClientConfigurationBuilder lettuceClientConfigurationBuilder = LettuceClientConfiguration
.builder().commandTimeout(redisProperties.getTimeout());
if (redisProperties.isSsl()) {
lettuceClientConfigurationBuilder.useSsl();
}
final LettuceClientConfiguration lettuceClientConfiguration = LettuceClientConfiguration.builder().commandTimeout(commandTimeOut).build();
return new LettuceConnectionFactory(redisClusterConfiguration,lettuceClientConfiguration);
}
protected LettuceConnectionFactory standaloneConnectionFactory(final RedisProperties redisProperties) {
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
if (!DigitalApiUtils.isBlankStr(redisProperties.getpassword())) {
redisStandaloneConfiguration.setPassword(redisProperties.getpassword());
}
redisProperties.setPort(redisProperties.getPort());
redisStandaloneConfiguration.setHostName(redisProperties.getHost());
final LettuceClientConfiguration.LettuceClientConfigurationBuilder lettuceClientConfigurationBuilder = LettuceClientConfiguration
.builder().commandTimeout(redisProperties.getTimeout());
if (redisProperties.isSsl()) {
lettuceClientConfigurationBuilder.useSsl();
}
final LettuceClientConfiguration lettuceClientConfiguration = LettuceClientConfiguration.builder().commandTimeout(commandTimeOut).build();
return new LettuceConnectionFactory(redisStandaloneConfiguration,lettuceClientConfiguration);
}
protected LettuceConnectionFactory sentinelConnectionFactory(final RedisProperties redisProperties) {
RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration()
.master(redisProperties.getSentinel().getMaster());
redisProperties.getSentinel().getNodes().forEach(s -> sentinelConfig.sentinel(s,redisProperties.getPort()));
sentinelConfig.setPassword(redisProperties.getpassword());
sentinelConfig.setSentinelPassword(redisProperties.getpassword());
return new LettuceConnectionFactory(sentinelConfig,LettuceClientConfiguration.builder().commandTimeout(commandTimeOut).build());
}
@Bean
@Qualifier("redisConnectionFactory")
@Primary
protected LettuceConnectionFactory redisConnectionFactory(final RedisProperties redisProperties) {
LettuceConnectionFactory connectionFactory = null;
switch (redisType) {
case "STANDALONE":
connectionFactory = standaloneConnectionFactory(redisProperties);
break;
case "SENTINEL":
connectionFactory = sentinelConnectionFactory(redisProperties);
break;
case "CLUSTER":
connectionFactory = clusterConnectionFactory(redisProperties);
break;
default:
connectionFactory = standaloneConnectionFactory(redisProperties);
break;
}
return connectionFactory;
}
@Bean
@Qualifier("stringRedistemplate")
@Primary
StringRedistemplate stringRedistemplate(final RedisProperties redisProperties) {
StringRedistemplate stringRedistemplate = new StringRedistemplate(redisConnectionFactory(redisProperties));
stringRedistemplate.setKeySerializer(new StringRedisSerializer());
stringRedistemplate.setValueSerializer(new StringRedisSerializer());
return stringRedistemplate;
}
}
@Configuration
public class RedisCacheConfig {
@Value("${redis.cache.type}")
String redisCacheType;
@Value("${redis.commandTimeOut}")
Duration commandTimeOut;
protected LettuceConnectionFactory clusterConnectionFactory(final RedisCacheProperties redisProperties) {
RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration(redisProperties.getCluster().getNodes());
redisClusterConfiguration.setPassword(redisProperties.getpassword());
final LettuceClientConfiguration.LettuceClientConfigurationBuilder lettuceClientConfigurationBuilder = LettuceClientConfiguration
.builder().commandTimeout(redisProperties.getTimeout());
if (redisProperties.isSsl()) {
lettuceClientConfigurationBuilder.useSsl();
}
final LettuceClientConfiguration lettuceClientConfiguration = LettuceClientConfiguration.builder().commandTimeout(commandTimeOut).build();
return new LettuceConnectionFactory(redisClusterConfiguration,lettuceClientConfiguration);
}
protected LettuceConnectionFactory standaloneConnectionFactory(final RedisCacheProperties redisProperties) {
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
if(!DigitalApiUtils.isBlankStr(redisProperties.getpassword())){
redisStandaloneConfiguration.setHostName(redisProperties.getHost());
}
redisStandaloneConfiguration.setPassword(redisProperties.getpassword());
redisProperties.setPort(redisProperties.getPort());
final LettuceClientConfiguration.LettuceClientConfigurationBuilder lettuceClientConfigurationBuilder = LettuceClientConfiguration
.builder().commandTimeout(redisProperties.getTimeout());
if (redisProperties.isSsl()) {
lettuceClientConfigurationBuilder.useSsl();
}
final LettuceClientConfiguration lettuceClientConfiguration = LettuceClientConfiguration.builder().commandTimeout(commandTimeOut).build();
return new LettuceConnectionFactory(redisStandaloneConfiguration,lettuceClientConfiguration);
}
protected LettuceConnectionFactory sentinelConnectionFactory(final RedisCacheProperties redisProperties) {
RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration()
.master(redisProperties.getSentinel().getMaster());
redisProperties.getSentinel().getNodes().forEach(s -> sentinelConfig.sentinel(s,LettuceClientConfiguration.builder().commandTimeout(commandTimeOut).build());
}
@Bean
@Qualifier("redisCacheConnectionFactory")
protected LettuceConnectionFactory redisCacheConnectionFactory(final RedisCacheProperties redisProperties) {
LettuceConnectionFactory connectionFactory = null;
switch (redisCacheType) {
case "STANDALONE":
connectionFactory = standaloneConnectionFactory(redisProperties);
break;
case "SENTINEL":
connectionFactory = sentinelConnectionFactory(redisProperties);
break;
case "CLUSTER":
connectionFactory = clusterConnectionFactory(redisProperties);
break;
default:
connectionFactory = standaloneConnectionFactory(redisProperties);
break;
}
return connectionFactory;
}
@Bean
@Qualifier("redisCacheStringTemplate")
StringRedistemplate redisCacheStringTemplate(final RedisCacheProperties redisProperties) {
StringRedistemplate stringRedistemplate = new StringRedistemplate(redisCacheConnectionFactory(redisProperties));
stringRedistemplate.setKeySerializer(new StringRedisSerializer());
stringRedistemplate.setValueSerializer(new StringRedisSerializer());
return stringRedistemplate;
}
@Bean
@Qualifier("cacheHashOperations")
public HashOperations cacheHashOperations(final RedisCacheProperties redisProperties) {
return redisCacheStringTemplate(redisProperties).opsForHash();
}
}
应用程序属性是
redis.type=SENTINEL
spring.redis.port=26379
spring.redis.sentinel.master=mymaster
spring.redis.sentinel.nodes={IP1}
spring.redis.password=password
spring.redis.timeout=PT20.345S
redis.commandTimeOut=3000ms
spring.cache.port=26379
spring.cache.sentinel.master=mymastercache
spring.cache.sentinel.nodes={IP2}
spring.cache.password=password
spring.cache.timeout=PT20.345S
redis.cache=3000ms
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。