Redis哨兵模式切换database
为了实现数据隔离
本文是切换redis的database
用同样的方法也可以切换不同的redis服务器或者集群
注册多个RedisTemplate
实现了BeanFactoryAware接口,会在Bean初始化阶段执行其方法
多个Redis实例也可使用这种方式
get(String topOrg) 方法可以根据topOrg去BeanFactory中获取对应的redisTemplate
topOrg可以存在ThreadLocal或者其他地方
@Component
public class RedisUtilFactory implements BeanFactoryAware {
private final static Logger logger = LoggerFactory.getLogger(RedisUtilFactory.class);
@Autowired
private RedisUtilConfig redisUtilConfig;
private static DefaultListableBeanFactory beanFactory;
/**
* get current redisTemplate
*
* @return
*/
public RedisTemplate get(String topOrg) {
String beanName = composeBeanName(topOrg);
if (beanFactory.containsBean(beanName)) {
Object bean = beanFactory.getBean(beanName);
if (bean instanceof RedisTemplate) {
return (RedisTemplate) bean;
}
}
// todo exception
logger.info("can not find redisTemplate by topOrg");
return null;
}
/**
* get current redisTemplate
*
* @return
*/
public RedisTemplate get() {
return get(ContextUtil.getTopOrg());
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
DefaultListableBeanFactory listableBeanFactory = (DefaultListableBeanFactory) beanFactory;
logger.info("[databaseMap]" + redisUtilConfig.getDatabase().toString());
for (String topOrg : redisUtilConfig.getDatabase().keySet()) {
String beanName = composeBeanName(topOrg);
if (!listableBeanFactory.containsBean(beanName)) {
listableBeanFactory.registerSingleton(beanName, redisUtilConfig.getRedisTemplate(redisUtilConfig.getDatabase().get(topOrg)));
}
}
RedisUtilFactory.beanFactory = listableBeanFactory;
}
private String composeBeanName(String topOrg) {
return RedisTemplate.class.getSimpleName() + redisUtilConfig.getDatabase().get(topOrg);
}
}
redis配置类
package com.oneconnect.sg.config;
import org.apache.commons.lang.math.NumberUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
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.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.jedis.JedisClientConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import redis.clients.jedis.JedisPoolConfig;
import java.time.Duration;
import java.util.ArrayList;
import java.