文章目录
会问问题的小明:如何实现Redis多数据源切换?
AI大佬: 废话少说,上操作
下面是 Redis 多数据源配置的详细代码,使用了 @RedisDataSource 注解来实现:
RedisConfig.java:
@Configuration
@EnableTransactionManagement
public class RedisConfig {
@Bean
@ConfigurationProperties(prefix = "spring.redis.default")
public JedisPoolConfig defaultRedisConfig() {
return new JedisPoolConfig();
}
@Bean(name = "defaultRedisConnectionFactory")
public RedisConnectionFactory defaultRedisConnectionFactory() {
return createConnectionFactory(defaultRedisConfig(), "localhost", 6379);
}
@Bean
@RedisDataSource(defaultDataSource = true)
public RedisTemplate<Object, Object> defaultRedisTemplate() {
return createRedisTemplate(defaultRedisConnectionFactory());
}
@Bean
@ConfigurationProperties(prefix = "spring.redis.secondary")
public JedisPoolConfig secondaryRedisConfig() {
return new JedisPoolConfig();
}
@Bean(name = "secondaryRedisConnectionFactory")
public RedisConnectionFactory secondaryRedisConnectionFactory() {
return createConnectionFactory(secondaryRedisConfig(), "localhost", 6380);
}
@Bean
@RedisDataSource(dataSourceName = "secondaryRedis", defaultDataSource = false)
public RedisTemplate<Object, Object> secondaryRedisTemplate() {
return createRedisTemplate(secondaryRedisConnectionFactory());
}
@Bean(name = "redisTemplateMap")
public Map<String, RedisTemplate> redisTemplateMap() {
Map<String, RedisTemplate> redisTemplateMap = new HashMap<>();
redisTemplateMap.put("defaultRedisTemplate", defaultRedisTemplate());
redisTemplateMap.put("secondaryRedisTemplate", secondaryRedisTemplate());
return redisTemplateMap;
}
@Bean
public RedisTemplateHolder redisTemplateHolder() {
return new RedisTemplateHolder(redisTemplateMap());
}
private RedisConnectionFactory createConnectionFactory(JedisPoolConfig poolConfig, String host, int port) {
JedisConnectionFactory connectionFactory = new JedisConnectionFactory();
connectionFactory.setHostName(host);
connectionFactory.setPort(port);
connectionFactory.setPoolConfig(poolConfig);
connectionFactory.afterPropertiesSet();
return connectionFactory;
}
private RedisTemplate<Object, Object> createRedisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(connectionFactory);
redisTemplate.setEnableTransactionSupport(true);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
RedisDataSource.java:
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RedisDataSource {
/**
* Redis数据源名称,用于区分不同的数据源,必填项
*
* @return
*/
String dataSourceName();
/**
* 是否为默认数据源,选填项
*
* @return
*/
boolean defaultDataSource() default false;
}
RedisTemplateHolder.java:
public class RedisTemplateHolder {
private final Map<String, RedisTemplate> redisTemplateMap;
public RedisTemplateHolder(Map<String, RedisTemplate> redisTemplateMap) {
this.redisTemplateMap = redisTemplateMap;
}
public RedisTemplate getRedisTemplate(String dataSourceName) {
return redisTemplateMap.get(dataSourceName);
}
public RedisTemplate getDefaultRedisTemplate() {
for (Map.Entry<String, RedisTemplate> entry : redisTemplateMap.entrySet()) {
RedisTemplate redisTemplate = entry.getValue();
RedisDataSource redisDataSource = redisTemplate.getClass().getAnnotation(RedisDataSource.class);
if (redisDataSource.defaultDataSource()) {
return redisTemplate;
}
}
return null;
}
}
RedisService.java:
@Service
public class RedisService {
@Autowired
private RedisTemplateHolder redisTemplateHolder;
public void add(String key, String value) {
RedisTemplate redisTemplate = redisTemplateHolder.getDefaultRedisTemplate();
redisTemplate.opsForValue().set(key, value);
}
public void add(String key, String value, String dataSourceName) {
RedisTemplate redisTemplate = redisTemplateHolder.getRedisTemplate(dataSourceName);
redisTemplate.opsForValue().set(key, value);
}
public String get(String key) {
RedisTemplate redisTemplate = redisTemplateHolder.getDefaultRedisTemplate();
return (String) redisTemplate.opsForValue().get(key);
}
public String get(String key, String dataSourceName) {
RedisTemplate redisTemplate = redisTemplateHolder.getRedisTemplate(dataSourceName);
return (String) redisTemplate.opsForValue().get(key);
}
}
总结一下
以上代码中,我们配置了两个 Redis 数据源,分别为 defaultRedis 和 secondaryRedis,使用 @RedisDataSource 注解标记了每个 Redis 数据源。在 RedisConfig中创建了 RedisTemplate 实例,并将其保存在一个 Map 中,然后使用 RedisTemplateHolder 对象来管理 RedisTemplate 实例,并根据需要获取相应的 RedisTemplate。在 RedisService 中,我们可以通过 RedisTemplateHolder 来调用相应的 RedisTemplate 来操作 Redis 数据库。
以上就是 Redis 多数据源配置的详细代码。