【AI教我烧操作】如何实现Redis多数据源切换

文章介绍了如何在Spring环境中配置Redis的多数据源切换,包括创建`RedisConfig`类定义不同数据源的连接工厂,使用`@RedisDataSource`注解标记数据源,以及创建`RedisTemplateHolder`来管理和获取特定数据源的`RedisTemplate`,从而在`RedisService`中实现对不同Redis实例的操作。
摘要由CSDN通过智能技术生成

会问问题的小明:如何实现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 多数据源配置的详细代码。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值