spring-boot 速成(12) - 如何注入多个redis StringRedisTemplate
默认情况下,spring-boot的redis自动配置,只能注册一个StringRedisTemplate实例,如果希望注入多个,比如:1个读写database 0,1个读写database 1 ... ,默认的自动配置就不行了,可以参考下面的做法:
一、创建多实例配置类
1 package cn.mwee.order.cloud.admin.common.config; 2 3 import org.springframework.beans.factory.annotation.Value; 4 import org.springframework.context.annotation.Bean; 5 import org.springframework.context.annotation.Configuration; 6 import org.springframework.context.annotation.Primary; 7 import org.springframework.data.redis.connection.RedisConnectionFactory; 8 import org.springframework.data.redis.connection.RedisSentinelConfiguration; 9 import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; 10 import org.springframework.data.redis.core.StringRedisTemplate; 11 import org.springframework.data.redis.serializer.StringRedisSerializer; 12 import redis.clients.jedis.JedisPoolConfig; 13 14 import java.util.HashSet; 15 import java.util.Set; 16 17 /** 18 * Created by 菩提树下的杨过(http://yjmyzz.cnblogs.com/) on 19/09/2017. 19 */ 20 @Configuration 21 public class RedisConfig { 22 23 @Value("${redis.sentinel.group}") 24 protected String sentinelGroupName; 25 26 @Value("${redis.sentinel.nodes}") 27 protected String sentinelNodes; 28 29 @Value("${redis.maxTotal}") 30 protected int maxTotal; 31 32 @Value("${redis.minIdle}") 33 protected int minIdle; 34 35 @Value("${redis.maxIdle}") 36 protected int maxIdle; 37 38 @Value("${redis.maxWaitMillis}") 39 protected long maxWaitMillis; 40 41 @Value("${redis.testOnBorrow}") 42 protected boolean testOnBorrow; 43 44 @Value("${redis.testOnReturn}") 45 protected boolean testOnReturn; 46 47 @Value("${redis.password}") 48 protected String password; 49 50 @Value("${redis.timeout}") 51 protected int timeout; 52 53 @Bean 54 public RedisSentinelConfiguration redisSentinelConfiguration() { 55 String[] nodes = sentinelNodes.split(","); 56 Set<String> setNodes = new HashSet<>(); 57 for (String n : nodes) { 58 setNodes.add(n.trim()); 59 } 60 RedisSentinelConfiguration configuration = new RedisSentinelConfiguration(sentinelGroupName, setNodes); 61 return configuration; 62 } 63 64 @Bean 65 public JedisPoolConfig jedisPoolConfig() { 66 JedisPoolConfig poolConfig = new JedisPoolConfig(); 67 poolConfig.setMaxTotal(maxTotal); 68 poolConfig.setMinIdle(minIdle); 69 poolConfig.setMaxIdle(maxIdle); 70 poolConfig.setMaxWaitMillis(maxWaitMillis); 71 poolConfig.setTestOnBorrow(testOnBorrow); 72 poolConfig.setTestOnReturn(testOnReturn); 73 return poolConfig; 74 } 75 76 @Bean 77 public StringRedisSerializer stringRedisSerializer() { 78 return new StringRedisSerializer(); 79 } 80 81 @Bean(name = "redisTemplate00") 82 @Primary 83 public StringRedisTemplate redisTemplate00() { 84 return buildRedisTemplate(buildConnectionFactory(0)); 85 } 86 87 @Bean(name = "redisTemplate01") 88 public StringRedisTemplate redisTemplate01() { 89 return buildRedisTemplate(buildConnectionFactory(1)); 90 } 91 92 @Bean(name = "redisTemplate02") 93 public StringRedisTemplate redisTemplate02() { 94 return buildRedisTemplate(buildConnectionFactory(2)); 95 } 96 97 @Bean(name = "redisTemplate03") 98 public StringRedisTemplate redisTemplate03() { 99 return buildRedisTemplate(buildConnectionFactory(3)); 100 } 101 102 @Bean(name = "redisTemplate04") 103 public StringRedisTemplate redisTemplate04() { 104 return buildRedisTemplate(buildConnectionFactory(4)); 105 } 106 107 private JedisConnectionFactory buildConnectionFactory(int database) { 108 JedisConnectionFactory connectionFactory = new JedisConnectionFactory(redisSentinelConfiguration(), jedisPoolConfig()); 109 connectionFactory.setUsePool(true); 110 connectionFactory.setTimeout(timeout); 111 connectionFactory.setDatabase(database); 112 connectionFactory.setPassword(password); 113 connectionFactory.afterPropertiesSet(); 114 return connectionFactory; 115 } 116 117 protected StringRedisTemplate buildRedisTemplate(RedisConnectionFactory connectionFactory) { 118 StringRedisTemplate template = new StringRedisTemplate(); 119 template.setConnectionFactory(connectionFactory); 120 template.setValueSerializer(stringRedisSerializer()); 121 template.afterPropertiesSet(); 122 return template; 123 } 124 125 }
上面的示例,注入了5个redisTemplate实例,分别对应redis的0到4,共5个database。
二、配置类application.yml
redis: sentinel: group: ${redis.sentinel.group} nodes: ${redis.sentinel.nodes} maxTotal: ${redis.maxTotal} minIdle: ${redis.minIdle} maxWaitMillis: ${redis.maxWait} testOnBorrow: ${redis.testOnBorrow} testOnReturn: ${redis.testOnReturn} password: timeout: ${redis.timeout}
大家把里面的占位符,换成具体值就可以了。
作者:菩提树下的杨过
出处:http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。