springboot redis多数据源
springboot中默认的redis配置是只能对单个redis库进行操作的。
那么我们需要多个库操作的时候这个时候就可以采用redis多数据源。
本代码参考RedisAutoConfiguration源码进行整改成的多数据源配置
注意:数据源2就是数据源1copy了一份代码,把所有的gisredis改成appredis,并去除数据源2的@Primary即可。如果还需要增加多个数据源,以此类推
配置redis数据源1:
package com.aaaa.config.redis; import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties.Cluster;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties.Sentinel;
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.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisNode;
import org.springframework.data.redis.connection.RedisSentinelConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils; import redis.clients.jedis.JedisPoolConfig; /**
*
* @desc Redis配置
* @author josnow
* @date 2018年1月17日 上午10:51:36
* @version 1.0.0
*/
@Configuration
public class RedisConfiggisredis { @Bean(name = "gisredisRedisProperties")
@ConfigurationProperties(prefix = "spring.redis.gisredis")
@Primary
public RedisProperties gisredisRedisProperties() {
RedisProperties redisProperties = new RedisProperties();
return redisProperties;
} // //@Bean("gisredisRedisTemplate")
// public RedisTemplate<Object, Object> redisTemplate(@Qualifier("gisredisRedisConnectionFactory")RedisConnectionFactory
// redisConnectionFactory)
// throws UnknownHostException {
// RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();
// template.setConnectionFactory(redisConnectionFactory);
// return template;
// } @Bean("gisredisStringRedisTemplate")
@Primary
public StringRedisTemplate stringRedisTemplate(
@Qualifier("gisredisRedisConnectionFactory")RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
} @Bean("gisredisRedisConnectionFactory")
@Primary
public RedisConnectionFactory redisConnectionFactory(
@Qualifier("gisredisRedisProperties") RedisProperties redisProperties) throws UnknownHostException { return setRedisConnectionFactory(redisProperties, null, null);
} private JedisConnectionFactory setRedisConnectionFactory(RedisProperties redisProperties,
RedisSentinelConfiguration sentinelConfiguration, RedisClusterConfiguration clusterConfiguration)
throws UnknownHostException {
return applyProperties(
createJedisConnectionFactory(redisProperties, sentinelConfiguration, clusterConfiguration),
redisProperties);
} private final JedisConnectionFactory applyProperties(JedisConnectionFactory factory,
RedisProperties redisProperties) {
factory.setHostName(redisProperties.getHost());
factory.setPort(redisProperties.getPort());
if (redisProperties.getPassword() != null) {
factory.setPassword(redisProperties.getPassword());
}
factory.setDatabase(redisProperties.getDatabase());
if (redisProperties.getTimeout() > 0) {
factory.setTimeout(redisProperties.getTimeout());
}
return factory;
} private final RedisSentinelConfiguration getSentinelConfig(RedisProperties redisProperties,
RedisSentinelConfiguration sentinelConfiguration) {
if (sentinelConfiguration != null) {
return sentinelConfiguration;
}
Sentinel sentinelProperties = redisProperties.getSentinel();
if (sentinelProperties != null) {
RedisSentinelConfiguration config = new RedisSentinelConfiguration();
config.master(sentinelProperties.getMaster());
config.setSentinels(createSentinels(sentinelProperties));
return config;
}
return null;
} /**
* Create a {@link RedisClusterConfiguration} if necessary.
*
* @return {@literal null} if no cluster settings are set.
*/
private final RedisClusterConfiguration getClusterConfiguration(RedisProperties redisProperties,
RedisClusterConfiguration clusterConfiguration) {
if (clusterConfiguration != null) {
return clusterConfiguration;
}
if (redisProperties.getCluster() == null) {
return null;
}
Cluster clusterProperties = redisProperties.getCluster();
RedisClusterConfiguration config = new RedisClusterConfiguration(clusterProperties.getNodes()); if (clusterProperties.getMaxRedirects() != null) {
config.setMaxRedirects(clusterProperties.getMaxRedirects());
}
return config;
} private List<RedisNode> createSentinels(Sentinel sentinel) {
List<RedisNode> nodes = new ArrayList<RedisNode>();
for (String node : StringUtils.commaDelimitedListToStringArray(sentinel.getNodes())) {
try {
String[] parts = StringUtils.split(node, ":");
Assert.state(parts.length == 2, "Must be defined as 'host:port'");
nodes.add(new RedisNode(parts[0], Integer.valueOf(parts[1])));
} catch (RuntimeException ex) {
throw new IllegalStateException("Invalid redis sentinel " + "property '" + node + "'", ex);
}
}
return nodes;
} private JedisConnectionFactory createJedisConnectionFactory(RedisProperties redisProperties,
RedisSentinelConfiguration sentinelConfiguration, RedisClusterConfiguration clusterConfiguration) {
JedisPoolConfig poolConfig = redisProperties.getPool() != null ? jedisPoolConfig(redisProperties)
: new JedisPoolConfig(); if (getSentinelConfig(redisProperties, sentinelConfiguration) != null) {
return new JedisConnectionFactory(getSentinelConfig(redisProperties, sentinelConfiguration), poolConfig);
}
if (getClusterConfiguration(redisProperties, clusterConfiguration) != null) {
return new JedisConnectionFactory(getClusterConfiguration(redisProperties, clusterConfiguration),
poolConfig);
}
return new JedisConnectionFactory(poolConfig);
} private JedisPoolConfig jedisPoolConfig(RedisProperties redisProperties) {
JedisPoolConfig config = new JedisPoolConfig();
RedisProperties.Pool props = redisProperties.getPool();
config.setMaxTotal(props.getMaxActive());
config.setMaxIdle(props.getMaxIdle());
config.setMinIdle(props.getMinIdle());
config.setMaxWaitMillis(props.getMaxWait());
return config;
} }
配置redis数据源2:
package com.aaaa.config.redis; import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties.Cluster;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties.Sentinel;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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.RedisSentinelConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils; import redis.clients.jedis.JedisPoolConfig; /**
*
* @desc Redis配置
* @author josnow
* @date 2018年1月17日 上午10:51:36
* @version 1.0.0
*/
@Configuration
public class RedisConfigappredis { @Bean(name = "appredisRedisProperties")
@ConfigurationProperties(prefix = "spring.redis.appredis")
public RedisProperties appredisRedisProperties() {
RedisProperties redisProperties = new RedisProperties();
return redisProperties;
} // //@Bean("appredisRedisTemplate")
// public RedisTemplate<Object, Object> redisTemplate(@Qualifier("appredisRedisConnectionFactory")RedisConnectionFactory
// redisConnectionFactory)
// throws UnknownHostException {
// RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();
// template.setConnectionFactory(redisConnectionFactory);
// return template;
// } @Bean("appredisStringRedisTemplate")
public StringRedisTemplate stringRedisTemplate(
@Qualifier("appredisRedisConnectionFactory") RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
} @Bean("appredisRedisConnectionFactory")
public RedisConnectionFactory redisConnectionFactory(
@Qualifier("appredisRedisProperties") RedisProperties redisProperties) throws UnknownHostException { return setRedisConnectionFactory(redisProperties, null, null);
} private JedisConnectionFactory setRedisConnectionFactory(RedisProperties redisProperties,
RedisSentinelConfiguration sentinelConfiguration, RedisClusterConfiguration clusterConfiguration)
throws UnknownHostException {
return applyProperties(
createJedisConnectionFactory(redisProperties, sentinelConfiguration, clusterConfiguration),
redisProperties);
} private final JedisConnectionFactory applyProperties(JedisConnectionFactory factory,
RedisProperties redisProperties) {
factory.setHostName(redisProperties.getHost());
factory.setPort(redisProperties.getPort());
if (redisProperties.getPassword() != null) {
factory.setPassword(redisProperties.getPassword());
}
factory.setDatabase(redisProperties.getDatabase());
if (redisProperties.getTimeout() > 0) {
factory.setTimeout(redisProperties.getTimeout());
}
return factory;
} private final RedisSentinelConfiguration getSentinelConfig(RedisProperties redisProperties,
RedisSentinelConfiguration sentinelConfiguration) {
if (sentinelConfiguration != null) {
return sentinelConfiguration;
}
Sentinel sentinelProperties = redisProperties.getSentinel();
if (sentinelProperties != null) {
RedisSentinelConfiguration config = new RedisSentinelConfiguration();
config.master(sentinelProperties.getMaster());
config.setSentinels(createSentinels(sentinelProperties));
return config;
}
return null;
} /**
* Create a {@link RedisClusterConfiguration} if necessary.
*
* @return {@literal null} if no cluster settings are set.
*/
private final RedisClusterConfiguration getClusterConfiguration(RedisProperties redisProperties,
RedisClusterConfiguration clusterConfiguration) {
if (clusterConfiguration != null) {
return clusterConfiguration;
}
if (redisProperties.getCluster() == null) {
return null;
}
Cluster clusterProperties = redisProperties.getCluster();
RedisClusterConfiguration config = new RedisClusterConfiguration(clusterProperties.getNodes()); if (clusterProperties.getMaxRedirects() != null) {
config.setMaxRedirects(clusterProperties.getMaxRedirects());
}
return config;
} private List<RedisNode> createSentinels(Sentinel sentinel) {
List<RedisNode> nodes = new ArrayList<RedisNode>();
for (String node : StringUtils.commaDelimitedListToStringArray(sentinel.getNodes())) {
try {
String[] parts = StringUtils.split(node, ":");
Assert.state(parts.length == 2, "Must be defined as 'host:port'");
nodes.add(new RedisNode(parts[0], Integer.valueOf(parts[1])));
} catch (RuntimeException ex) {
throw new IllegalStateException("Invalid redis sentinel " + "property '" + node + "'", ex);
}
}
return nodes;
} private JedisConnectionFactory createJedisConnectionFactory(RedisProperties redisProperties,
RedisSentinelConfiguration sentinelConfiguration, RedisClusterConfiguration clusterConfiguration) {
JedisPoolConfig poolConfig = redisProperties.getPool() != null ? jedisPoolConfig(redisProperties)
: new JedisPoolConfig(); if (getSentinelConfig(redisProperties, sentinelConfiguration) != null) {
return new JedisConnectionFactory(getSentinelConfig(redisProperties, sentinelConfiguration), poolConfig);
}
if (getClusterConfiguration(redisProperties, clusterConfiguration) != null) {
return new JedisConnectionFactory(getClusterConfiguration(redisProperties, clusterConfiguration),
poolConfig);
}
return new JedisConnectionFactory(poolConfig);
} private JedisPoolConfig jedisPoolConfig(RedisProperties redisProperties) {
JedisPoolConfig config = new JedisPoolConfig();
RedisProperties.Pool props = redisProperties.getPool();
config.setMaxTotal(props.getMaxActive());
config.setMaxIdle(props.getMaxIdle());
config.setMinIdle(props.getMinIdle());
config.setMaxWaitMillis(props.getMaxWait());
return config;
} }
redis数据源1和数据源2的配置yml
spring:
redis:
gisredis:
host: 10.142.142.142
port: 6379
database: 6
testOnBorrow: true
pool:
max-active: 10000
max-idle: 1000
max-wait: 60000
min-idle: 0
appredis:
host: 10.142.141.84
port: 6379
database: 5
testOnBorrow: true
pool:
max-active: 10000
max-idle: 1000
max-wait: 60000
min-idle: 0
配置就这么多,要注意的是多个redis数据源必须指定一个默认的数据源。使用@Primary来指定,并且只能指定一个默认redis数据源。
注意:数据源2就是数据源1copy了一份代码,把所有的gisredis改成appredis,并去除数据源2的@Primary即可。如果还需要增加多个数据源,以此类推
最后在使用的时候
@Autowired
@Qualifier("appredisStringRedisTemplate")
private StringRedisTemplate appredisStringRedisTemplate;
即可得到指定的redis源,使用起来也是很方便
springboot redis多数据源的更多相关文章
- springboot redis多数据源设置
遇到这样一个需求:运营人员在发布内容的时候可以选择性的发布到测试库.开发库和线上库. 项目使用的是spring boot集成redis,实现如下: 1. 引入依赖 <dependency> ...
- Spring Boot 2.x Redis多数据源配置(jedis,lettuce)
Spring Boot 2.x Redis多数据源配置(jedis,lettuce) 96 不敢预言的预言家 0.1 2018.11.13 14:22* 字数 65 阅读 727评论 0喜欢 2 多数 ...
- springboot2.1+redis多数据源的配置
springboot系列学习笔记全部文章请移步值博主专栏**: spring boot 2.X/spring cloud Greenwich. 由于是一系列文章,所以后面的文章可能会使用到前面文 ...
- 补习系列(14)-springboot redis 整合-数据读写
目录 一.简介 二.SpringBoot Redis 读写 A. 引入 spring-data-redis B. 序列化 C. 读写样例 三.方法级缓存 四.连接池 小结 一.简介 在 补习系列(A3 ...
- SpringBoot+Redis整合
SpringBoot+Redis整合 1.在pom.xml添加Redis依赖 <!--整合Redis--> <dependency> <groupId>org.sp ...
- springboot添加多数据源连接池并配置Mybatis
springboot添加多数据源连接池并配置Mybatis 转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9190226.html May 12, 2018 ...
- springboot之多数据源配置JdbcTemplate
springboot多数据源配置,代码如下 DataSourceConfig package com.rookie.bigdata.config; import org.springframework ...
- springboot配置Druid数据源
springboot配置druid数据源 Author:SimpleWu springboot整合篇 前言 对于数据访问层,无论是Sql还是NoSql,SpringBoot默认采用整合SpringDa ...
- springboot +redis配置
springboot +redis配置 pom依赖 <dependency> <groupId>org.springframework.boot</groupId> ...
随机推荐
- Spring定时任务(一):SpringTask使用
背景:在日常开发中,经常会用到任务调度这类程序.实现方法常用的有:A. 通过java.util.Timer.TimerTask实现. B.通过Spring自带的SpringTask. C. 通过Spr ...
- Mybatis 系列9
上篇系列8中 简单介绍了mybatis的查询,至此,CRUD都已讲完. 本文将介绍mybatis强大的动态SQL. 那么,问题来了: 什么是动态SQL? 动态SQL有什么作用? 传统的使用JDBC的方 ...
- Django 2.0 Release note阅读简记
最前面就是大家都知道的这个版本开始只支持py3.4+,而且下一个大版本就不支持3.4,再就是建议所有插件开始放弃1.11 1.最惊艳的变化,就是URL配置正则表达式的简化,旧的: url(r'^art ...
- 对比Cassandra、 Mongodb、CouchDB、Redis、Riak、 Membase、Neo4j、HBase
转自:http://www.cnblogs.com/alephsoul-alephsoul/archive/2013/04/26/3044630.html 导读:Kristóf Kovács 是一位软 ...
- Kotlin实践记录
Kotlin中网络请求和Json解析: Request(url).run()为Kotlin中的网络请求方式,Json解析是自己封装类的操作. Json.get().toObject(Request(u ...
- Nowcoder84D
Nowcoder84D 传送门 很有趣的进制转换题! 如果x满足题意,那么x+k-1一定能符合要求! 因为k-1用k进制表示就是1,-1,1+(-1)=0所以数位之和不变! 用map维护一下前缀和.就 ...
- C# 数据库链接字符串加密工具
有些项目尤其是WinForm或者是WPF项目,针对一些工具形式的小项目,不想软件流出去之后,懂程序的的拿到手之后一看配置文件就知道了我们数据库的用户名和密码,如果外网能访问的话,那就麻烦大了.所以这里 ...
- jenkins中集成commander应用
jenkins中集成commander应用 jenkins 集成测试 promotion 最近参加公司的集成测试平台的开发,在开发中遇到了不少问题,两个星期的迭代也即将完成,在这也用这篇博客记录下开发 ...
- [CVPR2015] Is object localization for free? – Weakly-supervised learning with convolutional neural networks论文笔记
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px "Helvetica Neue"; color: #323333 } p. ...
- PAT1134:Vertex Cover
1134. Vertex Cover (25) 时间限制 600 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A vertex ...