微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法使用 Spring 启动创建 Redis Sentinel Lettuce 多个连接

如何解决无法使用 Spring 启动创建 Redis Sentinel Lettuce 多个连接

所以目前的要求是这样的。

  1. 两个独立的 Redis Sentinel 服务器
  2. 一个用作数据库一个用作缓存

问题只在于哨兵

我能够为数据库和缓存创建配置。 但是官方的 RedisSentinelConfiguration 类具有以下硬编码字段。 因此缓存连接也指向数据库连接。

enter image description here

以下是我的redis配置文件

@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 举报,一经查实,本站将立刻删除。