Springboot配置Redis多数据源
Springboot默认支持一路redis,项目中有需求用到redis多数据源。本文仅基于Springboot进行多数据源配置,不依赖其它JAR包支持,理论可配置无限多的redis连接。
·
前言
Springboot默认支持一路redis,项目中有需求用到redis多数据源。本文仅基于Springboot进行多数据源配置,不依赖其它JAR包支持,理论可配置无限多的redis连接。
连接池
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
YML配置文件
spring:
redis:
host: 192.168.0.1
database: 0
port: 6379
password: '123456'
timeout: 3600
lettuce.pool.max-active: 16
lettuce.pool.max-wait: -1ms
lettuce.pool.max-idle: 8
lettuce.pool.min-idle: 1
# 自定义redis链接源,以下字段必须存在
redis2:
# Redis服务器地址
host: 192.168.0.2
# Redis数据库索引(默认为0)
database: 0
# Redis服务器连接端口
port: 6379
password: '123456'
#连接超时时间(毫秒)
timeout: 3600
# 连接池最大连接数(使用负值表示没有限制) 默认为8
lettuce.pool.max-active: 16
# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认为-1
lettuce.pool.max-wait: -1
# 连接池中的最大空闲连接 默认为8
lettuce.pool.max-idle: 8
# 连接池中的最小空闲连接 默认为 0
lettuce.pool.min-idle: 1
配置代码
@Configuration
public class Redis2Config {
@Value("${spring.redis2.database}")
private int database;
@Value("${spring.redis2.host}")
private String host;
@Value("${spring.redis2.password}")
private String password;
@Value("${spring.redis2.port}")
private int port;
@Value("${spring.redis2.timeout}")
private long timeout;
@Value("${spring.redis2.lettuce.pool.max-idle}")
private int maxIdle;
@Value("${spring.redis2.lettuce.pool.min-idle}")
private int minIdle;
@Value("${spring.redis2.lettuce.pool.max-active}")
private int maxActive;
@Value("${spring.redis2.lettuce.pool.max-wait}")
private long maxWait;
@Bean(name={"redisTemplate2"})//容器注入名称
public RedisTemplate<String, Object> redisTemplate2() {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redis2ConnectionFactory());
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(om);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// ------------ 如果需要直接反序列化 对于kotlin中的类必须是open class 否则会没有@class -------------
// key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
// hash的key也采用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
// value序列化方式采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash的value序列化方式采用jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
private JedisConnectionFactory redis2ConnectionFactory() {
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
redisStandaloneConfiguration.setDatabase(database);
redisStandaloneConfiguration.setHostName(host);
redisStandaloneConfiguration.setPort(port);
redisStandaloneConfiguration.setPassword(RedisPassword.of(password));
JedisClientConfiguration clientConfig = JedisClientConfiguration.builder()
.connectTimeout(Duration.ofMillis(timeout))
.usePooling()
.poolConfig(jedisPoolConfig())
.build();
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(redisStandaloneConfiguration,clientConfig);
jedisConnectionFactory.afterPropertiesSet();
return jedisConnectionFactory;
}
/**
* jedis连接池配置
*/
private JedisPoolConfig jedisPoolConfig() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxIdle(maxIdle);
jedisPoolConfig.setMaxTotal(maxActive);
jedisPoolConfig.setMaxWaitMillis(maxWait);
jedisPoolConfig.setMinIdle(minIdle);
return jedisPoolConfig;
}
}
使用
public class RankTest {
@Autowired
RedisTemplate redisTemplate;
@Resource(name = "redisTemplate2")
RedisTemplate redisTemplate2;
public Object get(String key){
return redisTemplate.opsForValue().get(key);
}
public Object get2(String key){
return redisTemplate2.opsForValue().get(key);
}
}
更多推荐
已为社区贡献1条内容
所有评论(0)