zoukankan      html  css  js  c++  java
  • springboot2.1+redis多数据源的配置

        springboot系列学习笔记全部文章请移步值博主专栏**: spring boot 2.X/spring cloud Greenwich。
        由于是一系列文章,所以后面的文章可能会使用到前面文章的项目。springboot系列代码全部上传至GitHub:https://github.com/liubenlong/springboot2_demo
        本系列环境:Java11;springboot 2.1.1.RELEASE;springcloud Greenwich.RELEASE;MySQL 8.0.5;
    文章目录
        多数据源配置

    有时候会遇到在一个项目中访问多个redis数据源的情况,这里就模拟一下springboot2.1+redis多数据源的配置
    多数据源配置
    这里采用不同的datebase模拟多数据源。

    spring:
      redis:
        host: 127.0.0.1
        port: 6379
        database: 0
        lettuce:
          pool:
            max-active: 200 #连接池最大连接数(使用负值表示没有限制)
            max-idle: 20 # 连接池中的最大空闲连接
            min-idle: 5 #连接池中的最小空闲连接
            # 这里在IDEA中显示红色错误,不用管,因为org.springframework.boot.autoconfigure.data.redis.RedisProperties.Pool.setMaxWait(Duration maxWait)
            # 方法参数是Duration,IDEA无法识别,但是会自动注入成功
            max-wait: 2000 # 当连接池耗尽时, 抛出异常之前,连接分配被阻塞的时间,也就是连接池满后最长等待时间,负值表示无限期等待
      redis2:
        host: 127.0.0.1
        port: 6379
        database: 1

    由于使用了多数据源,固不可以使用默认的springboot进行加载初始化了,这里需要使用自定义config来实现。

        这里需要配置lettuce连接池–> LettuceConnectionFactory–>RedisTemplate

    import com.alibaba.fastjson.support.spring.FastJsonRedisSerializer;
    import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
    import org.springframework.beans.factory.annotation.Qualifier;
    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.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.RedisSerializer;

    @Configuration
    public class SpringbootConfig {

        /**
         * 配置lettuce连接池
         *
         * @return
         */
        @Bean
        @ConfigurationProperties(prefix = "spring.redis.lettuce.pool")
        public GenericObjectPoolConfig redisPool() {
            return new GenericObjectPoolConfig<>();
        }

        /**
         * 配置第一个数据源的
         *
         * @return
         */
        @Bean
        @ConfigurationProperties(prefix = "spring.redis")
        public RedisStandaloneConfiguration redisConfig() {
            return new RedisStandaloneConfiguration();
        }

        /**
         * 配置第二个数据源
         *
         * @return
         */
        @Bean
        @ConfigurationProperties(prefix = "spring.redis2")
        public RedisStandaloneConfiguration redisConfig2() {
            return new RedisStandaloneConfiguration();
        }

        /**
         * 配置第一个数据源的连接工厂
         * 这里注意:需要添加@Primary 指定bean的名称,目的是为了创建两个不同名称的LettuceConnectionFactory
         *
         * @param config
         * @param redisConfig
         * @return
         */
        @Bean("factory")
        @Primary
        public LettuceConnectionFactory factory(GenericObjectPoolConfig config, RedisStandaloneConfiguration redisConfig) {
            LettuceClientConfiguration clientConfiguration = LettucePoolingClientConfiguration.builder().poolConfig(config).build();
            return new LettuceConnectionFactory(redisConfig, clientConfiguration);
        }

        @Bean("factory2")
        public LettuceConnectionFactory factory2(GenericObjectPoolConfig config, RedisStandaloneConfiguration redisConfig2) {
            LettuceClientConfiguration clientConfiguration = LettucePoolingClientConfiguration.builder().poolConfig(config).build();
            return new LettuceConnectionFactory(redisConfig2, clientConfiguration);
        }

        /**
         * 配置第一个数据源的RedisTemplate
         * 注意:这里指定使用名称=factory 的 RedisConnectionFactory
         * 并且标识第一个数据源是默认数据源 @Primary
         *
         * @param factory
         * @return
         */
        @Bean("redisTemplate")
        @Primary
        public RedisTemplate<String, String> redisTemplate(@Qualifier("factory") RedisConnectionFactory factory) {
            return getStringStringRedisTemplate(factory);
        }

        /**
         * 配置第一个数据源的RedisTemplate
         * 注意:这里指定使用名称=factory2 的 RedisConnectionFactory
         *
         * @param factory2
         * @return
         */
        @Bean("redisTemplate2")
        public RedisTemplate<String, String> redisTemplate2(@Qualifier("factory2") RedisConnectionFactory factory2) {
            return getStringStringRedisTemplate(factory2);
        }

        /**
         * 设置序列化方式 (这一步不是必须的)
         *
         * @param factory2
         * @return
         */
        private RedisTemplate<String, String> getStringStringRedisTemplate(RedisConnectionFactory factory2) {
            StringRedisTemplate template = new StringRedisTemplate(factory2);
            template.setKeySerializer(RedisSerializer.string());
            template.setValueSerializer(new FastJsonRedisSerializer<>(Object.class));
            template.setHashKeySerializer(RedisSerializer.string());
            template.setHashValueSerializer(new FastJsonRedisSerializer<>(Object.class));
            return template;
        }
    }


    使用也非常简单:

    /**
     * 不写默认使用带有@Primary的RedisTemplate
     */
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    @Qualifier("redisTemplate2")
    private RedisTemplate redisTemplate2;

    原文:https://blog.csdn.net/liubenlong007/article/details/86477692

     
  • 相关阅读:
    【题解】 保镖 半平面交
    【题解】 CF1492E Almost Fault-Tolerant Database 暴力+复杂度分析
    【题解】 闷声刷大题 带悔贪心+wqs二分
    【题解】 「WC2021」表达式求值 按位+表达式树+树形dp LOJ3463
    EasyNVR及EasyRTC平台使用Go语言项目管理GoVendor和gomod的使用总结
    一天一个开发技巧:如何基于WebRTC建立P2P通信?
    HTML5如何实现直播推流?值得学习一下!
    java后端学习-第一部分java基础:Scanner的基本使用
    java后端学习-第一部分java基础:三元运算符、运算符优先级、标识符、关键字和保留字
    java后端学习-第一部分java基础:赋值运算符
  • 原文地址:https://www.cnblogs.com/lykbk/p/fgfdfgfg3543443434.html
Copyright © 2011-2022 走看看