美文网首页Java大数据
Redis-实现SpringBoot集成Redis多数据源

Redis-实现SpringBoot集成Redis多数据源

作者: Java弟中弟 | 来源:发表于2021-09-30 13:52 被阅读0次

    背景

    有些时候在一个项目里,由于业务问题,可能仅仅操作一个Redis数据源已经不能满足,比如某个运营系统,对接着多个不同的服务,处理数据时又不想通过远程调用,那只能增加一个数据源来解决问题,像MySQL的多数据源一样。

    配置示例

    这里连接池选用的是lettuce。

    redis:
      host: localhost
      port: 6379
      password: 123456
      timeout: 60000
      database: 10
      lettuce:
        pool:
          min-idle: 0
          max-idle: 10
          max-wait: -1
          max-active: 200
          time-between-eviction-runs: -1
    redis-live:
      host: localhost
      port: 6379
      password: 123456
      database: 0
    
    

    实现代码

    关于序列化使用的是jackson。

    以下提供了创建RedisTemplate以及StringRedisTemplate。

    关于二者的区别:

    • 两者的关系是StringRedisTemplate继承RedisTemplate。
    • 两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。
    • SDR默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略。 StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。 RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。
    /**
     * <p>
     * RedisLettuce 连接实例配置
     * </p>
     *
     * @author zhengshangjin
     * @version 1.0.0
     * @since 1.0.0
     * created on 2020-04-23
     */
    @Configuration
    @EnableCaching
    public class RedisLettuceConfig {
    
        /**
         * live数据源
         */
        @Value("${spring.redis-live.host}")
        private String redisLiveHost;
    
        @Value("${spring.redis-live.port}")
        private int redisLivePort;
    
        @Value("${spring.redis-live.password}")
        private String redisLivePass;
    
        @Value("${spring.redis-live.database}")
        private int redisLiveDb;
    
        /**
         * 公共配置
         */
        @Value("${spring.redis.timeout}")
        private long timeout;
    
        @Value("${spring.redis.lettuce.pool.min-idle}")
        private int minIdle;
    
        @Value("${spring.redis.lettuce.pool.max-idle}")
        private int maxIdle;
    
        @Value("${spring.redis.lettuce.pool.max-active}")
        private int maxActive;
    
        @Value("${spring.redis.lettuce.pool.max-wait}")
        private int maxWait;
    
        /**
         * 装配 RedisTemplate
         * <p>
         * 这里根据默认连接配置 装配实例
         * </>
         *
         * @param redisConnectionFactory 默认
         * @return redisTemplate
         * @author zhengshangjin
         * created on 2020-04-23
         */
        @Bean(name = "redisTemplate")
        public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
            return createRedisTemplate(redisConnectionFactory);
        }
    
        /**
         * 装配 StringRedisTemplate
         * <p>
         * 这里根据默认连接配置 装配实例
         * </>
         * @param redisConnectionFactory 默认
         * @return StringRedisTemplate
         * @author zhengshangjin
         * created on 2020-04-23
         */
        @Bean(name = "stringRedisTemplate")
        public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
            return createStringRedisTemplate(redisConnectionFactory);
        }
    
        /**
         * 装配 Live数据源
         *
         * @return liveStringRedisTemplate
         * @author zhengshangjin
         * created on 2020-04-23
         */
        @Bean(name = "liveStringRedisTemplate")
        public StringRedisTemplate liveStringRedisTemplate() {
            return createStringRedisTemplate(redisLiveHost, redisLivePort, redisLivePass, redisLiveDb);
        }
    
        /**
         * 创建 RedisTemplate
         *
         * @param redisConnectionFactory redisConnectionFactory
         * @return RedisTemplate
         * @author zhengshangjin
         * created on 2020-04-23
         */
        public RedisTemplate<Object, Object> createRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
            ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
            objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
    
            Jackson2JsonRedisSerializer<?> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
            serializer.setObjectMapper(objectMapper);
    
            RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
            redisTemplate.setConnectionFactory(redisConnectionFactory);
            redisTemplate.setKeySerializer(new StringRedisSerializer());
            redisTemplate.setValueSerializer(serializer);
            redisTemplate.setHashKeySerializer(new StringRedisSerializer());
            redisTemplate.setHashValueSerializer(serializer);
            redisTemplate.afterPropertiesSet();
            return redisTemplate;
        }
    
        /**
         * 创建 StringRedisTemplate
         *
         * @param redisConnectionFactory redisConnectionFactory
         * @return StringRedisTemplate
         * @author zhengshangjin
         * created on 2020-04-23
         */
        public StringRedisTemplate createStringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
            StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
            stringRedisTemplate.setConnectionFactory(redisConnectionFactory);
            return stringRedisTemplate;
        }
    
        /**
         * 创建 StringRedisTemplate
         *
         * @param host     主机
         * @param port     端口
         * @param password 密码
         * @param database 库
         * @return StringRedisTemplate
         * @author zhengshangjin
         * created on 2020-04-23
         */
        public StringRedisTemplate createStringRedisTemplate(String host, int port, String password, int database) {
            // 基本配置
            RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration();
            configuration.setHostName(host);
            configuration.setPort(port);
            configuration.setDatabase(database);
            if (ObjectUtils.isNotEmpty(password)) {
                RedisPassword redisPassword = RedisPassword.of(password);
                configuration.setPassword(redisPassword);
            }
    
            // 连接池通用配置
            GenericObjectPoolConfig<?> genericObjectPoolConfig = new GenericObjectPoolConfig<>();
            genericObjectPoolConfig.setMaxTotal(maxActive);
            genericObjectPoolConfig.setMinIdle(minIdle);
            genericObjectPoolConfig.setMaxIdle(maxIdle);
            genericObjectPoolConfig.setMaxWaitMillis(maxWait);
    
            // Lettuce Pool
            LettucePoolingClientConfiguration.LettucePoolingClientConfigurationBuilder builder = LettucePoolingClientConfiguration.builder();
            builder.poolConfig(genericObjectPoolConfig);
            builder.commandTimeout(Duration.ofSeconds(timeout));
            LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(configuration, builder.build());
            connectionFactory.afterPropertiesSet();
    
            StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
            stringRedisTemplate.setConnectionFactory(connectionFactory);
            return stringRedisTemplate;
        }
    
    }
    
    

    注入使用

    根据@Qualifier指定beanname来获取

    @Autowired
    @Qualifier("liveStringRedisTemplate")
    public StringRedisTemplate stringRedisTemplate;
    

    相关文章

      网友评论

        本文标题:Redis-实现SpringBoot集成Redis多数据源

        本文链接:https://www.haomeiwen.com/subject/qyjenltx.html