springboot集成多redis
定义xxxProperties和xxxRedisTemplate,不要定义xxxConnectFactory
也不要使用RedisProperties。复制成一份xxxProperties。
示例代码如下:
定义一个OneRedisProperties,把RedisProperties的代码复制到这里即可。
package com.xxx.config.redis;
import java.time.Duration;
import java.util.List;
public class OneRedisProperties {
// 把RedisProperties的代码复制到这里即可。
}定义OneRedisTemplate
package com.xxx.config.redis;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import com.ruoyi.common.redis.configure.FastJson2JsonRedisSerializer;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.connection.RedisClusterConfiguration;
import org.springframework.data.redis.connection.RedisConfiguration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.util.Objects;
@Configuration
public class OneRedisTemplateConfig {
@Bean
@ConfigurationProperties(prefix = "one.redis")
public OneRedisProperties oneRedisProperties() {
return new OneRedisProperties();
}
// 核心:参考 RedisAutoConfiguration 动态创建连接工厂
private RedisConnectionFactory createConnectionFactory(OneRedisProperties properties) {
RedisConfiguration redisConfiguration;
RedisProperties.Cluster cluster = properties.getCluster();
if (Objects.nonNull(cluster)) {
RedisClusterConfiguration clusterCfg = new RedisClusterConfiguration(cluster.getNodes());
if (Objects.nonNull(properties.getPassword())) {
clusterCfg.setPassword(properties.getPassword());
}
redisConfiguration = clusterCfg;
} else {
RedisStandaloneConfiguration standaloneCfg = new RedisStandaloneConfiguration();
standaloneCfg.setHostName(properties.getHost());
standaloneCfg.setPort(properties.getPort());
standaloneCfg.setDatabase(properties.getDatabase());
if (Objects.nonNull(properties.getPassword())) {
standaloneCfg.setPassword(properties.getPassword());
}
redisConfiguration = standaloneCfg;
}
// 调用 Spring 原生的连接工厂创建逻辑(Lettuce 是默认客户端)
LettuceConnectionFactory factory = new LettuceConnectionFactory(redisConfiguration);
factory.afterPropertiesSet();
return factory;
}
@Bean("oneRedisTemplate")
public RedisTemplate<Object, Object> oneRedisTemplate(
@Qualifier("oneRedisProperties") OneRedisProperties oneRedisProperties) {
RedisConnectionFactory cf = createConnectionFactory(oneRedisProperties);
return createRedisTemplate(cf);
}
// 复用 Spring 风格的序列化配置(与默认 RedisTemplate 保持一致)
public RedisTemplate<Object, Object> createRedisTemplate(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;
}
/*
若是定义了这个,会导致默认的RedisTemplate使用该连接工厂,索引可能会出错
@Bean("oneRedisConnectionFactory")
public RedisConnectionFactory oneRedisConnectionFactory(
@Qualifier("oneRedisProperties") OneRedisProperties oneRedisProperties) {
return createConnectionFactory(oneRedisProperties);
}
*/
}总结:只暴露 OneRedisProperties 和 OneRedisTemplate 两个bean。
作者:张三 创建时间:2025-10-28 19:01
最后编辑:张三 更新时间:2025-10-28 19:10
最后编辑:张三 更新时间:2025-10-28 19:10