springboot中默认的redis配置是只能对单个redis库进行操作的。

那么我们需要多个库操作的时候这个时候就可以采用redis多数据源。

本代码参考RedisAutoConfiguration源码进行整改成的多数据源配置

 

注意:数据源2就是数据源1copy了一份代码,把所有的gisredis改成appredis,并去除数据源2的@Primary即可。如果还需要增加多个数据源,以此类推

 

配置redis数据源1:

  1 package com.aaaa.config.redis;
  2 
  3 import java.net.UnknownHostException;
  4 import java.util.ArrayList;
  5 import java.util.List;
  6 
  7 import org.springframework.beans.factory.annotation.Qualifier;
  8 import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
  9 import org.springframework.boot.autoconfigure.data.redis.RedisProperties.Cluster;
 10 import org.springframework.boot.autoconfigure.data.redis.RedisProperties.Sentinel;
 11 import org.springframework.boot.context.properties.ConfigurationProperties;
 12 import org.springframework.context.annotation.Bean;
 13 import org.springframework.context.annotation.Configuration;
 14 import org.springframework.context.annotation.Primary;
 15 import org.springframework.data.redis.connection.RedisClusterConfiguration;
 16 import org.springframework.data.redis.connection.RedisConnectionFactory;
 17 import org.springframework.data.redis.connection.RedisNode;
 18 import org.springframework.data.redis.connection.RedisSentinelConfiguration;
 19 import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
 20 import org.springframework.data.redis.core.StringRedisTemplate;
 21 import org.springframework.util.Assert;
 22 import org.springframework.util.StringUtils;
 23 
 24 import redis.clients.jedis.JedisPoolConfig;
 25 
 26 /**
 27  * 
 28  * @desc Redis配置
 29  * @author josnow
 30  * @date 2018年1月17日 上午10:51:36
 31  * @version 1.0.0
 32  */
 33 @Configuration
 34 public class RedisConfiggisredis {
 35 
 36     @Bean(name = "gisredisRedisProperties")
 37     @ConfigurationProperties(prefix = "spring.redis.gisredis")
 38     @Primary
 39     public RedisProperties gisredisRedisProperties() {
 40         RedisProperties redisProperties = new RedisProperties();
 41         return redisProperties;
 42     }
 43 
 44     // //@Bean("gisredisRedisTemplate")
 45     // public RedisTemplate<Object, Object> redisTemplate(@Qualifier("gisredisRedisConnectionFactory")RedisConnectionFactory
 46     // redisConnectionFactory)
 47     // throws UnknownHostException {
 48     // RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();
 49     // template.setConnectionFactory(redisConnectionFactory);
 50     // return template;
 51     // }
 52 
 53     @Bean("gisredisStringRedisTemplate")
 54     @Primary
 55     public StringRedisTemplate stringRedisTemplate(
 56             @Qualifier("gisredisRedisConnectionFactory")RedisConnectionFactory redisConnectionFactory)
 57             throws UnknownHostException {
 58         StringRedisTemplate template = new StringRedisTemplate();
 59         template.setConnectionFactory(redisConnectionFactory);
 60         return template;
 61     }
 62 
 63     @Bean("gisredisRedisConnectionFactory")
 64     @Primary
 65     public RedisConnectionFactory redisConnectionFactory(
 66             @Qualifier("gisredisRedisProperties") RedisProperties redisProperties) throws UnknownHostException {
 67 
 68         return setRedisConnectionFactory(redisProperties, null, null);
 69     }
 70 
 71     private JedisConnectionFactory setRedisConnectionFactory(RedisProperties redisProperties,
 72             RedisSentinelConfiguration sentinelConfiguration, RedisClusterConfiguration clusterConfiguration)
 73             throws UnknownHostException {
 74         return applyProperties(
 75                 createJedisConnectionFactory(redisProperties, sentinelConfiguration, clusterConfiguration),
 76                 redisProperties);
 77     }
 78 
 79     private final JedisConnectionFactory applyProperties(JedisConnectionFactory factory,
 80             RedisProperties redisProperties) {
 81         factory.setHostName(redisProperties.getHost());
 82         factory.setPort(redisProperties.getPort());
 83         if (redisProperties.getPassword() != null) {
 84             factory.setPassword(redisProperties.getPassword());
 85         }
 86         factory.setDatabase(redisProperties.getDatabase());
 87         if (redisProperties.getTimeout() > 0) {
 88             factory.setTimeout(redisProperties.getTimeout());
 89         }
 90         return factory;
 91     }
 92 
 93     private final RedisSentinelConfiguration getSentinelConfig(RedisProperties redisProperties,
 94             RedisSentinelConfiguration sentinelConfiguration) {
 95         if (sentinelConfiguration != null) {
 96             return sentinelConfiguration;
 97         }
 98         Sentinel sentinelProperties = redisProperties.getSentinel();
 99         if (sentinelProperties != null) {
100             RedisSentinelConfiguration config = new RedisSentinelConfiguration();
101             config.master(sentinelProperties.getMaster());
102             config.setSentinels(createSentinels(sentinelProperties));
103             return config;
104         }
105         return null;
106     }
107 
108     /**
109      * Create a {@link RedisClusterConfiguration} if necessary.
110      * 
111      * @return {@literal null} if no cluster settings are set.
112      */
113     private final RedisClusterConfiguration getClusterConfiguration(RedisProperties redisProperties,
114             RedisClusterConfiguration clusterConfiguration) {
115         if (clusterConfiguration != null) {
116             return clusterConfiguration;
117         }
118         if (redisProperties.getCluster() == null) {
119             return null;
120         }
121         Cluster clusterProperties = redisProperties.getCluster();
122         RedisClusterConfiguration config = new RedisClusterConfiguration(clusterProperties.getNodes());
123 
124         if (clusterProperties.getMaxRedirects() != null) {
125             config.setMaxRedirects(clusterProperties.getMaxRedirects());
126         }
127         return config;
128     }
129 
130     private List<RedisNode> createSentinels(Sentinel sentinel) {
131         List<RedisNode> nodes = new ArrayList<RedisNode>();
132         for (String node : StringUtils.commaDelimitedListToStringArray(sentinel.getNodes())) {
133             try {
134                 String[] parts = StringUtils.split(node, ":");
135                 Assert.state(parts.length == 2, "Must be defined as 'host:port'");
136                 nodes.add(new RedisNode(parts[0], Integer.valueOf(parts[1])));
137             } catch (RuntimeException ex) {
138                 throw new IllegalStateException("Invalid redis sentinel " + "property '" + node + "'", ex);
139             }
140         }
141         return nodes;
142     }
143 
144     private JedisConnectionFactory createJedisConnectionFactory(RedisProperties redisProperties,
145             RedisSentinelConfiguration sentinelConfiguration, RedisClusterConfiguration clusterConfiguration) {
146         JedisPoolConfig poolConfig = redisProperties.getPool() != null ? jedisPoolConfig(redisProperties)
147                 : new JedisPoolConfig();
148 
149         if (getSentinelConfig(redisProperties, sentinelConfiguration) != null) {
150             return new JedisConnectionFactory(getSentinelConfig(redisProperties, sentinelConfiguration), poolConfig);
151         }
152         if (getClusterConfiguration(redisProperties, clusterConfiguration) != null) {
153             return new JedisConnectionFactory(getClusterConfiguration(redisProperties, clusterConfiguration),
154                     poolConfig);
155         }
156         return new JedisConnectionFactory(poolConfig);
157     }
158 
159     private JedisPoolConfig jedisPoolConfig(RedisProperties redisProperties) {
160         JedisPoolConfig config = new JedisPoolConfig();
161         RedisProperties.Pool props = redisProperties.getPool();
162         config.setMaxTotal(props.getMaxActive());
163         config.setMaxIdle(props.getMaxIdle());
164         config.setMinIdle(props.getMinIdle());
165         config.setMaxWaitMillis(props.getMaxWait());
166         return config;
167     }
168 
169 }

 

配置redis数据源2:

 

  1 package com.aaaa.config.redis;
  2 
  3 import java.net.UnknownHostException;
  4 import java.util.ArrayList;
  5 import java.util.List;
  6 
  7 import org.springframework.beans.factory.annotation.Qualifier;
  8 import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
  9 import org.springframework.boot.autoconfigure.data.redis.RedisProperties.Cluster;
 10 import org.springframework.boot.autoconfigure.data.redis.RedisProperties.Sentinel;
 11 import org.springframework.boot.context.properties.ConfigurationProperties;
 12 import org.springframework.context.annotation.Bean;
 13 import org.springframework.context.annotation.Configuration;
 14 import org.springframework.data.redis.connection.RedisClusterConfiguration;
 15 import org.springframework.data.redis.connection.RedisConnectionFactory;
 16 import org.springframework.data.redis.connection.RedisNode;
 17 import org.springframework.data.redis.connection.RedisSentinelConfiguration;
 18 import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
 19 import org.springframework.data.redis.core.StringRedisTemplate;
 20 import org.springframework.util.Assert;
 21 import org.springframework.util.StringUtils;
 22 
 23 import redis.clients.jedis.JedisPoolConfig;
 24 
 25 /**
 26  * 
 27  * @desc Redis配置
 28  * @author josnow
 29  * @date 2018年1月17日 上午10:51:36
 30  * @version 1.0.0
 31  */
 32 @Configuration
 33 public class RedisConfigappredis {
 34 
 35     @Bean(name = "appredisRedisProperties")
 36     @ConfigurationProperties(prefix = "spring.redis.appredis")
 37     public RedisProperties appredisRedisProperties() {
 38         RedisProperties redisProperties = new RedisProperties();
 39         return redisProperties;
 40     }
 41 
 42     // //@Bean("appredisRedisTemplate")
 43     // public RedisTemplate<Object, Object> redisTemplate(@Qualifier("appredisRedisConnectionFactory")RedisConnectionFactory
 44     // redisConnectionFactory)
 45     // throws UnknownHostException {
 46     // RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();
 47     // template.setConnectionFactory(redisConnectionFactory);
 48     // return template;
 49     // }
 50 
 51     @Bean("appredisStringRedisTemplate")
 52     public StringRedisTemplate stringRedisTemplate(
 53             @Qualifier("appredisRedisConnectionFactory") RedisConnectionFactory redisConnectionFactory)
 54             throws UnknownHostException {
 55         StringRedisTemplate template = new StringRedisTemplate();
 56         template.setConnectionFactory(redisConnectionFactory);
 57         return template;
 58     }
 59 
 60     @Bean("appredisRedisConnectionFactory")
 61     public RedisConnectionFactory redisConnectionFactory(
 62             @Qualifier("appredisRedisProperties") RedisProperties redisProperties) throws UnknownHostException {
 63 
 64         return setRedisConnectionFactory(redisProperties, null, null);
 65     }
 66 
 67     private JedisConnectionFactory setRedisConnectionFactory(RedisProperties redisProperties,
 68             RedisSentinelConfiguration sentinelConfiguration, RedisClusterConfiguration clusterConfiguration)
 69             throws UnknownHostException {
 70         return applyProperties(
 71                 createJedisConnectionFactory(redisProperties, sentinelConfiguration, clusterConfiguration),
 72                 redisProperties);
 73     }
 74 
 75     private final JedisConnectionFactory applyProperties(JedisConnectionFactory factory,
 76             RedisProperties redisProperties) {
 77         factory.setHostName(redisProperties.getHost());
 78         factory.setPort(redisProperties.getPort());
 79         if (redisProperties.getPassword() != null) {
 80             factory.setPassword(redisProperties.getPassword());
 81         }
 82         factory.setDatabase(redisProperties.getDatabase());
 83         if (redisProperties.getTimeout() > 0) {
 84             factory.setTimeout(redisProperties.getTimeout());
 85         }
 86         return factory;
 87     }
 88 
 89     private final RedisSentinelConfiguration getSentinelConfig(RedisProperties redisProperties,
 90             RedisSentinelConfiguration sentinelConfiguration) {
 91         if (sentinelConfiguration != null) {
 92             return sentinelConfiguration;
 93         }
 94         Sentinel sentinelProperties = redisProperties.getSentinel();
 95         if (sentinelProperties != null) {
 96             RedisSentinelConfiguration config = new RedisSentinelConfiguration();
 97             config.master(sentinelProperties.getMaster());
 98             config.setSentinels(createSentinels(sentinelProperties));
 99             return config;
100         }
101         return null;
102     }
103 
104     /**
105      * Create a {@link RedisClusterConfiguration} if necessary.
106      * 
107      * @return {@literal null} if no cluster settings are set.
108      */
109     private final RedisClusterConfiguration getClusterConfiguration(RedisProperties redisProperties,
110             RedisClusterConfiguration clusterConfiguration) {
111         if (clusterConfiguration != null) {
112             return clusterConfiguration;
113         }
114         if (redisProperties.getCluster() == null) {
115             return null;
116         }
117         Cluster clusterProperties = redisProperties.getCluster();
118         RedisClusterConfiguration config = new RedisClusterConfiguration(clusterProperties.getNodes());
119 
120         if (clusterProperties.getMaxRedirects() != null) {
121             config.setMaxRedirects(clusterProperties.getMaxRedirects());
122         }
123         return config;
124     }
125 
126     private List<RedisNode> createSentinels(Sentinel sentinel) {
127         List<RedisNode> nodes = new ArrayList<RedisNode>();
128         for (String node : StringUtils.commaDelimitedListToStringArray(sentinel.getNodes())) {
129             try {
130                 String[] parts = StringUtils.split(node, ":");
131                 Assert.state(parts.length == 2, "Must be defined as 'host:port'");
132                 nodes.add(new RedisNode(parts[0], Integer.valueOf(parts[1])));
133             } catch (RuntimeException ex) {
134                 throw new IllegalStateException("Invalid redis sentinel " + "property '" + node + "'", ex);
135             }
136         }
137         return nodes;
138     }
139 
140     private JedisConnectionFactory createJedisConnectionFactory(RedisProperties redisProperties,
141             RedisSentinelConfiguration sentinelConfiguration, RedisClusterConfiguration clusterConfiguration) {
142         JedisPoolConfig poolConfig = redisProperties.getPool() != null ? jedisPoolConfig(redisProperties)
143                 : new JedisPoolConfig();
144 
145         if (getSentinelConfig(redisProperties, sentinelConfiguration) != null) {
146             return new JedisConnectionFactory(getSentinelConfig(redisProperties, sentinelConfiguration), poolConfig);
147         }
148         if (getClusterConfiguration(redisProperties, clusterConfiguration) != null) {
149             return new JedisConnectionFactory(getClusterConfiguration(redisProperties, clusterConfiguration),
150                     poolConfig);
151         }
152         return new JedisConnectionFactory(poolConfig);
153     }
154 
155     private JedisPoolConfig jedisPoolConfig(RedisProperties redisProperties) {
156         JedisPoolConfig config = new JedisPoolConfig();
157         RedisProperties.Pool props = redisProperties.getPool();
158         config.setMaxTotal(props.getMaxActive());
159         config.setMaxIdle(props.getMaxIdle());
160         config.setMinIdle(props.getMinIdle());
161         config.setMaxWaitMillis(props.getMaxWait());
162         return config;
163     }
164 
165 }

 

 

 

 redis数据源1和数据源2的配置yml

  
   spring:
 1   redis:
 2     gisredis:
 3       host: 10.142.142.142
 4       port: 6379
 5       database: 6
 6       testOnBorrow: true
 7       pool:
 8         max-active: 10000
 9         max-idle: 1000
10         max-wait: 60000
11         min-idle: 0
12     appredis:
13       host: 10.142.141.84
14       port: 6379
15       database: 5
16       testOnBorrow: true
17       pool:
18         max-active: 10000
19         max-idle: 1000
20         max-wait: 60000
21         min-idle: 0

 

配置就这么多,要注意的是多个redis数据源必须指定一个默认的数据源。使用@Primary来指定,并且只能指定一个默认redis数据源。

 

注意:数据源2就是数据源1copy了一份代码,把所有的gisredis改成appredis,并去除数据源2的@Primary即可。如果还需要增加多个数据源,以此类推

 

最后在使用的时候

 

1 @Autowired
2 @Qualifier("appredisStringRedisTemplate")
3 private StringRedisTemplate appredisStringRedisTemplate;

 

即可得到指定的redis源,使用起来也是很方便