Redis配置多数据源(同一个Redis,多个不同db)

1、配置

  • yml 配置
  spring:
	  redis:
	    host: 10.252.176.77
	    port: 6379
	    password: Wxf5&qR%t
	    timeout: 3000
	    database:
	      db1: 10
	      db2: 12
	    pool:
	      max-active: 100 # 连接池最大连接数(使用负值表示没有限制)
	      max-wait: 2000 # 最大阻塞等待时间(负数表示没限制)
	      max-idle: 70 # 最大空闲连接
	      min-idle: 5
  • pom 配置
        <spring-boot.version>2.4.7</spring-boot.version>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
         <version>${spring-boot.version}</version>

2、配置类

  • 注意:在默认的配置中加上 @Primary
    @Value("${spring.redis.database.db1}")
    private int db1;

    @Value("${spring.redis.database.db2}")
    private int db2;


    @Value("${spring.redis.host}")
    private String host;

    @Value("${spring.redis.password}")
    private String password;

    @Value("${spring.redis.port}")
    private int port;

    @Value("${spring.redis.timeout}")
    private int timeout;

    @Value("${spring.redis.pool.max-idle}")
    private int maxIdle;

    @Value("${spring.redis.pool.max-active}")
    private int maxActive;

    @Value("${spring.redis.pool.min-idle}")
    private int minIdle;

    @Value("${spring.redis.pool.max-wait}")
    private long maxWait;

    @Bean
    public GenericObjectPoolConfig getPoolConfig(){
        // 配置redis连接池
        GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
        poolConfig.setMaxTotal(maxActive);
        poolConfig.setMaxIdle(maxIdle);
        poolConfig.setMinIdle(minIdle);
        poolConfig.setMaxWaitMillis(maxWait);
        return poolConfig;
    }

    private RedisConnectionFactory getFactory(int database) {
        // 构建工厂对象
        RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
        config.setHostName(host);
        config.setPort(port);
        config.setPassword(RedisPassword.of(password));
        LettucePoolingClientConfiguration clientConfig = LettucePoolingClientConfiguration.builder()
                .commandTimeout(Duration.ofSeconds(timeout))
                .poolConfig(getPoolConfig())
                .build();
        LettuceConnectionFactory factory = new LettuceConnectionFactory(config, clientConfig);
        // 设置使用的redis数据库
        factory.setDatabase(database);
        // 重新初始化工厂
        factory.afterPropertiesSet();
        return factory;
    }

    @NotNull
    private RedisTemplate<String, Object> getObjectRedisTemplate() {
        StringRedisSerializer keySerializer = new StringRedisSerializer();
        RedisSerializer<Object> valueSerializer = new GenericFastJsonRedisSerializer();
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setKeySerializer(keySerializer);
        redisTemplate.setValueSerializer(valueSerializer);
        redisTemplate.setHashKeySerializer(keySerializer);
        redisTemplate.setHashValueSerializer(valueSerializer);
        return redisTemplate;
    }

    @Bean("redisTemplate")
    @Primary
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> redisTemplate = getObjectRedisTemplate();
        redisTemplate.setConnectionFactory(this.getFactory(db1));
        return redisTemplate;
    }


    @Bean("stringRedisTemplate")
    @Primary
    public StringRedisTemplate stringRedisTemplate() {
        RedisConnectionFactory factory = getFactory(db1);
        return new StringRedisTemplate(factory);
    }


    @Bean("stringRedisTemplate2")
    public StringRedisTemplate getRedisTemplate2(){
        RedisConnectionFactory factory = getFactory(db2);
        return new StringRedisTemplate(factory);
    }

    @Bean("redisTemplate2")
    public RedisTemplate<String, Object> redisTemplate2() {
        RedisTemplate<String, Object> redisTemplate = getObjectRedisTemplate();
        redisTemplate.setConnectionFactory(this.getFactory(db2));
        return redisTemplate;
    }

3、使用

  • 注意:需要指定bean,两种方式@Resource和@Autowired、@Qualifier组合
    @Resource(name = "redisTemplate2")
//    @Autowired
//    @Qualifier("redisTemplate2")
    private RedisTemplate redisTemplate;

 private ExecutorOnlineInfoBO getOnlineInfo() {

        Set keys = redisTemplate.keys("security-executor::*");
        ExecutorOnlineInfoBO executorOnlineInfoBO = new ExecutorOnlineInfoBO();
        int count = 0;
        int size = keys.size() | 0;
        if (keys != null && size > 0) {
            List list = Objects.requireNonNull(redisTemplate.opsForValue().multiGet(keys));
            Iterator iterator = list.iterator();
            while (iterator.hasNext()) {
                Object tmp = iterator.next();
                Object executorInfo = ((JSONObject) tmp).get("executorInfo");
                if (ObjectUtils.isNotEmpty(executorInfo)) {
                    Object onlineType = ((JSONObject) executorInfo).get("onlineType");
                    if (ObjectUtils.isNotEmpty(onlineType)) {
                        count++;
                    }
                }

            }
        }
        executorOnlineInfoBO.setOnlineNum(count);
        executorOnlineInfoBO.setLeaveNum(size - count);
executorOnlineInfoBO);
        return executorOnlineInfoBO;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值