SpringBoot+RedisTemplate多数据源

采用的Spring-boot-starter-data中的redis,通过lettuce创建工厂类进行创建bean

第一步 引入依赖

PS:采用的是Spring Boot 2.3.4.RELEASE版本

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

第二步 配置yml

  redis:
    host: r-2.redis.rds.aliyuncs.com
    port: 6379
    password: 666
    timeout: 5000
    lettuce:
      pool:
        max-active: 32
        max-wait: 300
        max-idle: 16
        min-idle: 8
    database: 0
  redis-one:
    host: r-2.redis.rds.aliyuncs.com
    port: 6379
    password: 666
    timeout: 5000
    lettuce:
      pool:
        max-active: 32
        max-wait: 300
        max-idle: 16
        min-idle: 8
    database: 1

第三步 自定义配置了连接池对象和Redis的Standalone模式的配置(为了简化代码)

package net.zhongjunkeji.common.config.redis;

import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.data.redis.connection.RedisPassword;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;

public class UserRedisStandaloneConfiguration extends RedisStandaloneConfiguration {

    public UserRedisStandaloneConfiguration(RedisProperties redisProperties) {
        super.setHostName(redisProperties.getHost());
        super.setPassword(RedisPassword.of(redisProperties.getPassword()));
        super.setPort(redisProperties.getPort());
        super.setDatabase(redisProperties.getDatabase());
    }
}
package net.zhongjunkeji.common.config.redis;

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;

/**
 * <p>
 * 描述: 创建对象池()
 * </p>
 *
 * @author  GHQ·阿甘
 * @version 1.0.0
 * @since   2021/7/6 23:34
 **/
public class UserGenericObjectPoolConfig extends GenericObjectPoolConfig{

    public UserGenericObjectPoolConfig(RedisProperties redisProperties){
        this.setMaxTotal(redisProperties.getLettuce().getPool().getMaxActive());
        this.setMaxIdle(redisProperties.getLettuce().getPool().getMaxIdle());
        this.setMinIdle(redisProperties.getLettuce().getPool().getMinIdle());
        this.setMaxWaitMillis(redisProperties.getLettuce().getPool().getMaxWait().toMillis());
    }
}

第四步 创建Lettuce工厂类和RedisTemlateBean

package net.zhongjunkeji.common.config.redis;

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;
import org.springframework.data.redis.core.RedisTemplate;

import java.time.Duration;

/**
 * <p>
 * 描述: TODO
 * </p>
 *
 * @author GHQ·阿甘
 * @version 1.0.0
 * @since 2021-07-06
 **/
@Configuration
public class RedisMoreDataSourceConfig {


    /**
     * <p>描述:   默认(主0)Lettuce工厂类
     * <p>开发者: GHQ·阿甘
     * <p>时间:   2021/7/6 23:11
     *
     * @param defaultRedisConfig
     * @param defaultPoolConfig
     * @return org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory
     * @throws
     **/
    @Bean
    @Primary
    public LettuceConnectionFactory defaultLettuceConnectionFactory(RedisStandaloneConfiguration defaultRedisConfig,
                                                                    GenericObjectPoolConfig defaultPoolConfig) {
        LettuceClientConfiguration clientConfig = LettucePoolingClientConfiguration.builder().commandTimeout(Duration.ofMillis(100))
                .poolConfig(defaultPoolConfig).build();
        return new LettuceConnectionFactory(defaultRedisConfig, clientConfig);
    }


    /**
     * <p>描述:   one Lettuce工厂类
     * <p>开发者: GHQ·阿甘
     * <p>时间:   2021/7/7 0:20
     *
     * @param oneRedisConfig
     * @param onePoolConfig
     * @return org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory
     * @throws
     **/
    @Bean("oneLettuceConnectionFactory")
    @ConditionalOnBean(name = "oneRedisConfig")
    public LettuceConnectionFactory oneLettuceConnectionFactory(@Qualifier("oneRedisConfig") RedisStandaloneConfiguration oneRedisConfig,
                                                                @Qualifier("onePoolConfig") GenericObjectPoolConfig onePoolConfig) {
        LettuceClientConfiguration clientConfig = LettucePoolingClientConfiguration.builder().commandTimeout(Duration.ofMillis(100)).poolConfig(onePoolConfig).build();
        return new LettuceConnectionFactory(oneRedisConfig, clientConfig);
    }


    /**
     * <p>描述:   主默认(0)RedisTemplate
     * <p>开发者: GHQ·阿甘
     * <p>时间:   2021/7/7 0:26
     *
     * @param defaultLettuceConnectionFactory
     * @return org.springframework.data.redis.core.RedisTemplate<java.lang.String, java.lang.String>
     * @throws
     **/
    @Bean
    @Primary
    public RedisTemplate<String, String> defaultRedisTemplate(
            LettuceConnectionFactory defaultLettuceConnectionFactory) {
        RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(defaultLettuceConnectionFactory);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }


    /**
     * <p>描述:   (1)RedisTemplate
     * <p>开发者: GHQ·阿甘
     * <p>时间:   2021/7/7 0:26
     *
     * @param localLettuceConnectionFactory
     * @return org.springframework.data.redis.core.RedisTemplate<java.lang.String, java.lang.String>
     * @throws
     **/
    @Bean(name = "oneRedisTemplate")
    @ConditionalOnBean(name = "oneLettuceConnectionFactory")
    public RedisTemplate<String, String> oneRedisTemplate(@Qualifier("oneLettuceConnectionFactory") LettuceConnectionFactory localLettuceConnectionFactory) {
        RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(localLettuceConnectionFactory);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

    @Configuration
    @ConfigurationProperties(prefix = "spring.redis-one")
    public class OneRedisConfig extends RedisProperties {
        @Bean("onePoolConfig")
        public GenericObjectPoolConfig onePoolConfig() {
            return new UserGenericObjectPoolConfig(this);
        }

        @Bean("oneRedisConfig")
        public RedisStandaloneConfiguration oneRedisConfig() {
            return new UserRedisStandaloneConfiguration(this);
        }
    }


    @Configuration
    @ConfigurationProperties(prefix = "spring.redis")
    public class DefaultRedisConfig extends RedisProperties {
        @Bean
        @Primary
        public GenericObjectPoolConfig defaultPoolConfig() {
            return new UserGenericObjectPoolConfig(this);
        }

        @Bean
        @Primary
        public RedisStandaloneConfiguration defaultRedisConfig() {
            return new UserRedisStandaloneConfiguration(this);
        }
    }


}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Spring Boot中集成多个Redis数据源需要进行以下步骤: 1. 添加依赖:在pom.xml文件中添加Spring Boot Redis和Jedis依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> ``` 2. 配置多个数据源:在application.properties或application.yml文件中配置多个Redis数据源的连接信息。示例配置如下: ```properties # 第一个数据源 spring.redis.host=127.0.0.1 spring.redis.port=6379 spring.redis.password= spring.redis.database=0 # 第二个数据源 spring.redis.second.host=127.0.0.1 spring.redis.second.port=6380 spring.redis.second.password= spring.redis.second.database=1 ``` 3. 创建多个RedisTemplate:在配置类中创建多个RedisTemplate,每个Template对应一个Redis数据源。示例代码如下: ```java @Configuration public class RedisConfig { @Bean @Primary public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(redisConnectionFactory); // 设置key和value的序列化器 template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); return template; } @Bean("secondRedisTemplate") public RedisTemplate<String, Object> secondRedisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(redisConnectionFactory); // 设置key和value的序列化器 template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); return template; } } ``` 4. 使用多个数据源:在需要使用Redis的地方,注入对应的RedisTemplate即可。示例代码如下: ```java @RestController public class RedisController { @Autowired private RedisTemplate<String, Object> redisTemplate; @Autowired @Qualifier("secondRedisTemplate") private RedisTemplate<String, Object> secondRedisTemplate; @RequestMapping("/set") public String set() { redisTemplate.opsForValue().set("key1", "value1"); secondRedisTemplate.opsForValue().set("key2", "value2"); return "success"; } @RequestMapping("/get") public String get() { String value1 = (String) redisTemplate.opsForValue().get("key1"); String value2 = (String) secondRedisTemplate.opsForValue().get("key2"); return "value1: " + value1 + ", value2: " + value2; } } ``` 以上就是在Spring Boot中集成多个Redis数据源的简要步骤。通过配置不同的数据源和创建对应的RedisTemplate,可以实现对多个Redis实例的访问和操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值