SpringBoot连接redis,支持单点、集群、哨兵模式自适应配置(一、redisTemplate)

可以根据配置相应策略切换redis的模式

@Autowired
    RedisProperties redisProperties;
    @Autowired

    @Value("${spring.redis.strategy}")
    private String strategy;

    /**
     * 连接池配置信息
     */
    @Bean
    public JedisPoolConfig jedisPoolConfig() {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        //最大连接数
        jedisPoolConfig.setMaxTotal(redisProperties.getJedis().getPool() == null ? 100 : redisProperties.getJedis().getPool().getMaxIdle());
        //最小空闲连接数
        jedisPoolConfig.setMinIdle(redisProperties.getJedis().getPool() == null ? 20 : redisProperties.getJedis().getPool().getMinIdle());
        //当池内没有可用连接时,最大等待时间
        jedisPoolConfig.setMaxWaitMillis(redisProperties.getJedis().getPool() == null ? 10000 : redisProperties.getJedis().getPool().getMaxWait().toMillis());

        return jedisPoolConfig;
    }

    @Bean
    public JedisSentinelPool jedisSentinelPool(JedisPoolConfig jedisPoolConfig){
        JedisSentinelPool jedisSentinelPool = null;
        if (RedisUtils.SENTINEL == Integer.parseInt(strategy)) {
            Set<String> sentinels = new HashSet(redisProperties.getSentinel().getNodes());
            jedisSentinelPool = new JedisSentinelPool(redisProperties.getSentinel().getMaster(), sentinels,
                    jedisPoolConfig, redisProperties.getPassword());
        }
        return jedisSentinelPool;
    }

    //Redis 单点
    @Bean
    @ConditionalOnProperty(name="spring.redis.strategy", havingValue = "1")
    public JedisConnectionFactory getRedisFactory(JedisPoolConfig jedisPoolConfig) {
        log.info("load {}", "getRedisFactory");
        RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration(redisProperties.getHost(), redisProperties.getPort());
        if (StringUtils.isNotBlank(redisProperties.getPassword())) {
            configuration.setPassword(RedisPassword.of(redisProperties.getPassword()));
            configuration.setDatabase(redisProperties.getDatabase());
        }
        //获得默认的连接池构造
        //这里需要注意的是,edisConnectionFactoryJ对于Standalone模式的没有(RedisStandaloneConfiguration,JedisPoolConfig)的构造函数,对此
        //我们用JedisClientConfiguration接口的builder方法实例化一个构造器,还得类型转换
        JedisClientConfiguration.JedisPoolingClientConfigurationBuilder jpcf = (JedisClientConfiguration.JedisPoolingClientConfigurationBuilder) JedisClientConfiguration.builder();
        //修改我们的连接池配置
        jpcf.poolConfig(jedisPoolConfig);
        //通过构造器来构造jedis客户端配置
        JedisClientConfiguration jedisClientConfiguration = jpcf.build();
        JedisConnectionFactory factory = new JedisConnectionFactory(configuration, jedisClientConfiguration);
        return factory;
    }


    //Redis 哨兵
    //Redis 集群配置
    @Bean
    @ConditionalOnProperty(name="spring.redis.strategy", havingValue = "2")
    public JedisConnectionFactory getClusterRedisFactory(JedisPoolConfig jedisPoolConfig) {
        JedisConnectionFactory jedisConnectionFactory;
        log.info("load {}", "getClusterRedisFactory");
        RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration();
        for (String  s :redisProperties.getCluster().getNodes()) {
            String[] split1 = s.split(":");
            redisClusterConfiguration.addClusterNode(new RedisNode(split1[0], Integer.parseInt(split1[1])));
        }
        //集群时最大重定向个数
        redisClusterConfiguration.setMaxRedirects(5);
        jedisConnectionFactory = new JedisConnectionFactory(redisClusterConfiguration, jedisPoolConfig );
        if (StringUtils.isNotBlank(redisProperties.getPassword())) {
            redisClusterConfiguration.setPassword(RedisPassword.of(redisProperties.getPassword()));
        }
        return jedisConnectionFactory;
    }

    @Bean
    @ConditionalOnProperty(name="spring.redis.strategy", havingValue = "3")
    public JedisConnectionFactory getSentinelRedisFactory(JedisPoolConfig jedisPoolConfig ) {
        JedisConnectionFactory jedisConnectionFactory;
        log.info("load {}", "getSentinelRedisFactory");
        RedisSentinelConfiguration redisSentinelConfiguration = new RedisSentinelConfiguration();
        redisSentinelConfiguration.setMaster(redisProperties.getSentinel().getMaster());
        List<String> sentinelArray = redisProperties.getSentinel().getNodes();
        for (String s : sentinelArray) {
            try {
                String[] split1 = s.split(":");
                redisSentinelConfiguration.addSentinel(new RedisNode(split1[0], Integer.parseInt(split1[1])));
            } catch (Exception e) {
                throw new RuntimeException(String.format("出现配置错误!请确认node=[%s]是否正确", s));
            }
        }
        jedisConnectionFactory = new JedisConnectionFactory(redisSentinelConfiguration, jedisPoolConfig);
        if (StringUtils.isNotBlank(redisProperties.getPassword())) {
            redisSentinelConfiguration.setPassword(RedisPassword.of(redisProperties.getPassword()));
        }
        return jedisConnectionFactory;
    }
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值