springboot配置redis多数据源

该博客介绍了如何在Spring Boot中优雅地配置双数据源。通过YAML配置文件和代码设置,分别定义了两个Redis数据源,每个数据源包括数据库编号、主机名、端口、密码和连接池配置。使用Lettuce客户端配置,确保了连接池的管理和超时设置。示例代码展示了如何创建和配置RedisTemplate及StringRedisTemplate,以便在应用中分别操作这两个数据源。
摘要由CSDN通过智能技术生成

背景

其实程序里配置多数据源的需求还是挺多的,我们有一个项目是双数据源的,但是看起来,代码乱糟糟的,所以查了查,找了一种配置看起来清爽一点的,下面上代码

代码

代码分两部分,yml配置和config代码配置

yml

spring:
  redis:
    database: 0
    host: xxxx.xxx.aliyuncs.com
    port: 6379
    password: password
    lettuce:
      pool:
        max-active: 100
        max-idle: 10
        max-wait: 3000
        min-idle: 10
    timeout: 3000
  redis2:
    database: 0
    host: xxxx.xxx2.aliyuncs.com
    port: 6379
    password: password2 

代码配置

package com.airdoc.auth.config;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
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 org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.time.Duration;
/**
 * @author author
 * @date 2022/7/27
 * @apiNote
 */
@EnableCaching
@Configuration
public class MultiRedisConfig {

        @Value("${spring.redis.lettuce.pool.max-idle}")
        int maxIdle;
        @Value("${spring.redis.lettuce.pool.max-active}")
        int maxActive;
        @Value("${spring.redis.lettuce.pool.max-wait}")
        long maxWaitMillis;
        @Value("${spring.redis.lettuce.pool.min-idle}")
        int minIdle;
        @Value("${spring.redis.timeout}")
        int timeout;

        @Bean(name = "redisTemplate")
        public <T> RedisTemplate<String, T> redisTemplate(@Value("${spring.redis.database}") int database,
                                                 @Value("${spring.redis.host}") String hostName,
                                                 @Value("${spring.redis.port}") int port,
                                                 @Value("${spring.redis.password}") String password) {
            RedisTemplate<String, T> template = new RedisTemplate<>();
            template.setConnectionFactory(connectionFactory(database, hostName, port, password));
            template.setKeySerializer(new StringRedisSerializer());
            template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
            template.setHashKeySerializer(new StringRedisSerializer());
            template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
            return template;
        }


        @Bean(name = "gbRedisTemplate")
        public StringRedisTemplate gbRedisTemplate(@Value("${spring.redis2.database}") int database,
                                                    @Value("${spring.redis2.host}") String hostName,
                                                    @Value("${spring.redis2.port}") int port,
                                                    @Value("${spring.redis2.password}") String password) {
            StringRedisTemplate temple = new StringRedisTemplate();
            temple.setConnectionFactory(connectionFactory(database, hostName, port, password));
            return temple;
        }

        /**
         * 使用lettuce配置Redis连接信息
         *
         * @param database Redis数据库编号
         * @param hostName 服务器地址
         * @param port     端口
         * @param password 密码
         * @return RedisConnectionFactory
         */
        public RedisConnectionFactory connectionFactory(int database, String hostName, int port, String password) {

            RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration();
            configuration.setHostName(hostName);
            configuration.setPort(port);
            if (StringUtils.isNotBlank(password)) {
                configuration.setPassword(password);
            }
            if (database != 0) {
                configuration.setDatabase(database);
            }

            GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
            genericObjectPoolConfig.setMaxIdle(maxIdle);
            genericObjectPoolConfig.setMinIdle(minIdle);
            genericObjectPoolConfig.setMaxTotal(maxActive);
            genericObjectPoolConfig.setMaxWaitMillis(maxWaitMillis);

            LettuceClientConfiguration clientConfig = LettucePoolingClientConfiguration.builder()
                    .commandTimeout(Duration.ofMillis(timeout))
                    .poolConfig(genericObjectPoolConfig)
                    .build();

            LettuceConnectionFactory lettuce = new LettuceConnectionFactory(configuration, clientConfig);
            lettuce.afterPropertiesSet();
            return lettuce;
        }

}


总结

其实实现方式还是挺多的,还有一种我看也挺好玩,有兴趣可以看一下,指路 :Redis多数据源

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盖丽男

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值