Redis配置多数据源
一般来说单个服务都是只配置一个Redis地址端口指定数据库和一个关系型数据库。
但是也偶尔会出现一个服务需要连接不同的两个或以上的Redis地址进行读写数据,比如说最近的公司需求:员工分散在两个相似的单体服务,在新增员工时,要保证在两个数据库内的工号不重复且自增。
其实这种情况我觉得还是利用消息队列如RabbitMQ好处理的,但苦于目前的小中台内没有搭建完善的消息队列,所以暂时还是只能从数据源下手,再考虑到暂时以后也不会再新增类似服务,且管理新增员工的同事只有一个人,所以暂时不考虑并发情况了。
这个实现过程很简单,只不过是放在Nacos中的配置文件加多一个Redis连接地址、端口、需要用的数据库,之后在RedisConfig类再加一个数据源初始化的方法就完事了。
Java代码如下:
@Configuration
public class RedisTemplateConfig {
/**
* @description: 第一个数据源
*/
@Value("${spring.redis.first.host}")
private String firstHost;
@Value("${spring.redis.first.port}")
private String firstPort;
@Value("${spring.redis.first.database}")
private int firstDatabase;
/**
* @description: 第二个数据源
*/
@Value("${spring.redis.second.host}")
private String secondHost;
@Value("${spring.redis.second.port}")
private String secondPort;
@Value("${spring.redis.second.database}")
private int secondDatabase;
//最大空闲连接数
private static final int MAX_IDLE = 200;
//最大连接数
private static final int MAX_TOTAL = 1024;
//建立连接最长等待时间
private static final long MAX_WAIT_MILLIS = 10000;
/**
*
* @description: 配置工厂
*/
public RedisConnectionFactory connectionFactory(String host, int port, String password, int maxIdle,
int maxTotal, long maxWaitMillis, int index) {
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
jedisConnectionFactory.setHostName(host);
jedisConnectionFactory.setPort(port);
if (!StringUtils.isEmpty(password)) {
jedisConnectionFactory.setPassword(password);
}
if (index != 0) {
jedisConnectionFactory.setDatabase(index);
}
jedisConnectionFactory.setPoolConfig(poolConfig(maxIdle, maxTotal, maxWaitMillis, false));
jedisConnectionFactory.afterPropertiesSet();
return jedisConnectionFactory;
}
/**
*
* @description: 连接池配置
*/
public JedisPoolConfig poolConfig(int maxIdle, int maxTotal, long maxWaitMillis, boolean testOnBorrow) {
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxIdle(maxIdle);
poolConfig.setMaxTotal(maxTotal);
poolConfig.setMaxWaitMillis(maxWaitMillis);
poolConfig.setTestOnBorrow(testOnBorrow);
return poolConfig;
}
/**
*
* @description: 第一个数据源初始化
*/
@Bean(name = "redisFirstTemplate")
public StringRedisTemplate redisOrderTemplate() {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(
connectionFactory(firstHost, Integer.parseInt(firstPort), "", MAX_IDLE, MAX_TOTAL, MAX_WAIT_MILLIS, firstDatabase));
return template;
}
/**
*
* @description: 第二个数据源初始化
*/
@Bean(name = "redisSecondTemplate")
public StringRedisTemplate userUserTemplate() {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(
connectionFactory(secondHost, Integer.parseInt(secondPort), "", MAX_IDLE, MAX_TOTAL, MAX_WAIT_MILLIS, secondDatabase));
return template;
}
}