可以根据配置相应策略切换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;
}