实现多Redis数据源其实就是创建多个Redis数据源的连接,Springboot已经根据application.yml默认实现了一个Redis连接,我们再自己定义需要的多个Redis连接即可。实现如下:
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
/**
* Springboot默认实现数据源
*/
@Bean
@SuppressWarnings(value = {"unchecked", "rawtypes"})
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
return this.createRedisConnectionFactory(connectionFactory);
}
/**
* 能耗Redis数据源
*/
@Bean
@SuppressWarnings(value = {"unchecked", "rawtypes"})
public RedisTemplate<Object, Object> redisTemplateEnergy(
@Value("${spring.energyRedis.host}") String host,
@Value("${spring.energyRedis.port}") int port,
@Value("${spring.energyRedis.password}") String password,
@Value("${spring.energyRedis.database}") int database,
@Value("${spring.energyRedis.timeout}") long timeout,
@Value("${spring.energyRedis.lettuce.pool.max-active}") int maxActive,
@Value("${spring.energyRedis.lettuce.pool.max-wait}") int maxWait,
@Value("${spring.energyRedis.lettuce.pool.max-idle}") int maxIdle,
@Value("${spring.energyRedis.lettuce.pool.min-idle}") int minIdle
) {
// 基本配置
RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration();
configuration.setHostName(host);
configuration.setPort(port);
configuration.setDatabase(database);
if (!ObjectUtils.isEmpty(password)) {
configuration.setPassword(RedisPassword.of(password));
}
// 连接池通用配置
GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
genericObjectPoolConfig.setMaxTotal(maxActive);
genericObjectPoolConfig.setMinIdle(minIdle);
genericObjectPoolConfig.setMaxIdle(maxIdle);
genericObjectPoolConfig.setMaxWaitMillis(maxWait);
// lettuce pool
LettucePoolingClientConfiguration.LettucePoolingClientConfigurationBuilder builder = LettucePoolingClientConfiguration.builder();
builder.poolConfig(genericObjectPoolConfig);
builder.commandTimeout(Duration.ofSeconds(timeout));
LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(configuration, builder.build());
connectionFactory.afterPropertiesSet();
return this.createRedisConnectionFactory(connectionFactory);
}
/**
* 创建Redis连接
*/
public RedisTemplate<Object, Object> createRedisConnectionFactory(RedisConnectionFactory connectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class);
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
serializer.setObjectMapper(mapper);
// 使用StringRedisSerializer来序列化和反序列化redis的key值
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(serializer);
// Hash的key也采用StringRedisSerializer的序列化方式
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(serializer);
template.afterPropertiesSet();
return template;
}
}
方法参数在application.yml配置即可。