背景:
一个小需求,单Redis服务实例下根据业务配置多个数据库,需要自定义Redis配置稍作改动才能实现,此时就不能RedisTemplate一步就位了~
注: Redis使用 单线程-多路复用 IO模型 ,别把多业务的并发全加在一个redis实例上,最好多实例或者集群处理!
基本的配置我就不多说了,可以参考我之前的博客:SpringBoot 整合 Redis 使用详解
直接上步骤:
在 application.yml 中添加参数配置:
redis:
//此处设置多业务对应数据库
database:
fore: 0
wechat: 1
host: 117.133.13.74
password: yjyj
port: 6379
timeout: 3000
pool:
max-idle: 30
min-idle: 0
max-wait: -1
增加自定义配置类:
**
* @Author: yuanj
* @Date: 2019/2/16 16:35
*/
@Configuration
@EnableAutoConfiguration
public class RedisConfig {
@Value("${redis.database.fore}")
private int foreDatabase;
@Value("${redis.database.wechat}")
private int wechatDatabase;
@Value("${redis.host}")
private String host;
@Value("${redis.password}")
private String password;
@Value("${redis.port}")
private int port;
@Value("${redis.timeout}")
private int timeout;
@Value("${redis.pool.max-idle}")
private int maxIdle;
@Value("${redis.pool.min-idle}")
private int minIdle;
@Value("${redis.pool.max-wait}")
private long maxWait;
@Bean
public JedisPoolConfig getJedisPoolConfig() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxIdle(maxIdle);
jedisPoolConfig.setMinIdle(minIdle);
jedisPoolConfig.setMaxWaitMillis(maxWait);
return jedisPoolConfig;
}
@Bean(name = "foreRedisTemplate")
public RedisTemplate getForeRedisTemplate(){
JedisConnectionFactory connectionFactory = new JedisConnectionFactory();
connectionFactory.setPoolConfig(getJedisPoolConfig());
connectionFactory.setDatabase(foreDatabase); //此处配置database
connectionFactory.setHostName(host);
connectionFactory.setPassword(password);
connectionFactory.setPort(port);
connectionFactory.setTimeout(timeout);
connectionFactory.afterPropertiesSet(); //记得添加这行!
StringRedisTemplate stringRedisTemplate = new StringRedisTemplate(connectionFactory);
return stringRedisTemplate;
}
@Bean(name = "wechatRedisTemplate")
public RedisTemplate getWechatRedisTemplate(){
JedisConnectionFactory connectionFactory = new JedisConnectionFactory();
connectionFactory.setPoolConfig(getJedisPoolConfig());
connectionFactory.setDatabase(wechatDatabase);
connectionFactory.setHostName(host);
connectionFactory.setPassword(password);
connectionFactory.setPort(port);
connectionFactory.setTimeout(timeout);
connectionFactory.afterPropertiesSet();
StringRedisTemplate stringRedisTemplate = new StringRedisTemplate(connectionFactory);
return stringRedisTemplate;
}
}
测试:
@RestController
public class TestController {
@Autowired
private RedisConfig redisConfig;
@Autowired
private RedisTemplate foreRedisTemplate;
@Autowired
private RedisTemplate wechatRedisTemplate;
@RequestMapping(value = "/testRedis", method = RequestMethod.GET)
public String test() {
// RedisTemplate foreRedisTemplate = redisConfig.getForeRedisTemplate();
ValueOperations operations = foreRedisTemplate.opsForValue();
operations.set("age", "11");
// RedisTemplate wechatRedisTemplate = redisConfig.getWechatRedisTemplate();
ValueOperations operations2 = wechatRedisTemplate.opsForValue();
operations2.set("address", "bj");
return "OK";
}
}
注意:上面既可以直接autowire两个RedisTemplate,也可以通过redisConfig得到。
o ~