最近在开发的过程中遇到一个springboot服务需要访问不同的redis集群,默认的springboot只支持单个
StringRedisTemplate实例,于是就研究了一下配置多StringRedisTemplate 实例。
配置类:
package com.risk.engine.config.redis;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
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.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisNode;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import redis.clients.jedis.JedisPoolConfig;
import java.util.HashSet;
import java.util.Set;
/**
*
*/
@Configuration
public class RedisConfig {
@Value("${redis.cluster.nodes}")
protected String redisNodes;
@Value("${redis.cluster.nodes2}")
protected String redisNodes2;
@Value("${redis.maxTotal}")
protected int maxTotal;
@Value("${redis.testOnBorrow}")
protected boolean testOnBorrow;
@Value("${redis.testOnReturn}")
protected boolean testOnReturn;
@Value("${redis.pool.min-idle}")
protected int minIdle;
@Value("${redis.pool.max-idle}")
protected int maxIdle;
@Value("${redis.pool.max-wait}")
protected long maxWaitMillis;
@Value("${redis.timeout}")
protected int timeout;
@Value("${redis.password2}")
protected String password2;
@Primary
@Bean
public RedisClusterConfiguration redisClusterConfiguration(){
RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration();
//Set<RedisNode> clusterNodes
String[] serverArray = redisNodes.split(",");
Set<RedisNode> nodes = new HashSet<RedisNode>();
for(String ipPort:serverArray){
String[] ipAndPort = ipPort.split(":");
nodes.add(new RedisNode(ipAndPort[0].trim(),Integer.valueOf(ipAndPort[1])));
}
redisClusterConfiguration.setClusterNodes(nodes);
//redisClusterConfiguration.setMaxRedirects(mmaxRedirectsac);
return redisClusterConfiguration;
}
@Bean
public RedisClusterConfiguration redisClusterConfiguration2(){
RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration();
//Set<RedisNode> clusterNodes
String[] serverArray = redisNodes2.split(",");
Set<RedisNode> nodes = new HashSet<RedisNode>();
for(String ipPort:serverArray){
String[] ipAndPort = ipPort.split(":");
nodes.add(new RedisNode(ipAndPort[0].trim(),Integer.valueOf(ipAndPort[1])));
}
redisClusterConfiguration.setClusterNodes(nodes);
//redisClusterConfiguration.setMaxRedirects(mmaxRedirectsac);
return redisClusterConfiguration;
}
@Bean
public JedisPoolConfig jedisPoolConfig() {
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(maxTotal);
poolConfig.setMinIdle(minIdle);
poolConfig.setMaxIdle(maxIdle);
poolConfig.setMaxWaitMillis(maxWaitMillis);
poolConfig.setTestOnBorrow(testOnBorrow);
poolConfig.setTestOnReturn(testOnReturn);
return poolConfig;
}
@Bean
public StringRedisSerializer stringRedisSerializer() {
return new StringRedisSerializer();
}
//交易地址缓存
@Bean
public StringRedisTemplate stringRedisTemplate() {
return buildRedisTemplate(buildConnectionFactory());
}
//模型缓存
@Bean(name = "stringRedisTemplate2")
public StringRedisTemplate stringRedisTemplate2() {
return buildRedisTemplate(buildConnectionFactory2());
}
private JedisConnectionFactory buildConnectionFactory() {
JedisConnectionFactory connectionFactory = new JedisConnectionFactory(redisClusterConfiguration(), jedisPoolConfig());
connectionFactory.setUsePool(true);
connectionFactory.setTimeout(timeout);
connectionFactory.setDatabase(0);
//connectionFactory.setPassword(password);
connectionFactory.afterPropertiesSet();
return connectionFactory;
}
private JedisConnectionFactory buildConnectionFactory2() {
JedisConnectionFactory connectionFactory = new JedisConnectionFactory(redisClusterConfiguration2(), jedisPoolConfig());
connectionFactory.setUsePool(true);
connectionFactory.setTimeout(timeout);
connectionFactory.setDatabase(0);
if(StringUtils.isNotEmpty(password2)){
connectionFactory.setPassword(password2);
}
connectionFactory.afterPropertiesSet();
return connectionFactory;
}
protected StringRedisTemplate buildRedisTemplate(RedisConnectionFactory connectionFactory) {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(connectionFactory);
template.setValueSerializer(stringRedisSerializer());
template.afterPropertiesSet();
return template;
}
}
properties:
redis.cluster.nodes=192.168.0.232:6379,192.168.0.232:6380,192.168.0.232:6381,192.168.0.233:6382,192.168.0.233:6383,192.168.0.233:6384
#spring.redis.cluster.nodes=192.168.0.232:6379,192.168.0.232:6380,192.168.0.232:6381,192.168.0.233:6382,192.168.0.233:6383,192.168.0.233:6384
redis.pool.max-wait=6000
redis.pool.max-idle=50
redis.pool.min-idle=20
redis.timeout=60000
#模型缓存
redis.cluster.nodes2=192.168.0.232:6001,192.168.0.232:6002,192.168.0.232:6003,192.168.0.233:6004,192.168.0.233:6005,192.168.0.233:6006
redis.maxTotal=2000
redis.testOnBorrow=true
redis.testOnReturn=true
redis.password2=redis123
pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置之后srpingboot默认的StringRedisTemplate已经变成了自己配置的实例。