Springboot2.x 之redis 多数据源配置

2020-08-28  本文已影响0人  骑蚂蚁上高速_jun
  1. 添加 pom.xml 坐标
<!-- redis  -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency> <!--配置redis连接池-->
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>
  1. 连接属性在 application.yaml 中配置
spring:
  # 配置源 1
  redis1:
    database: 0
    host: 127.0.0.1
    port: 6379
    password: ""
    lettuce:
      pool:
        max-active: 8
        max-wait: 1
        max-idle: 8
        min-idle: 0 #
  redis2:
    database: 0
    host: 127.0.0.1
    port: 6379
    password: ""
    lettuce:
      pool:
        max-active: 8
        max-wait: 1
        max-idle: 8
        min-idle: 0 #
  1. 创建 Configuration 类 接管默认配置
package cn.waimaolang.demo.configura;

import cn.waimaolang.demo.command.MyMessageListenCommand;
import cn.waimaolang.demo.service.MessageConsumerService;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.connection.RedisClusterConfiguration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.DefaultLettucePool;
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.listener.ChannelTopic;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.io.Serializable;


@Configuration
public class RedisConfigura {

    @Value("${spring.redis1.host}")
    private String host;
    @Value("${spring.redis1.port}")
    private int port;
    @Value("${spring.redis1.password}")
    private String password;

    /**
     * 配置数据源1 基本连接属性
     * @return
     */
    private RedisStandaloneConfiguration getRedisConfig(){
        RedisStandaloneConfiguration config = new RedisStandaloneConfiguration(host,port);
        config.setPassword(password);
        config.setDatabase(0);
        return config;
    }

    /**
     * 配置数据源1 连接池配置
     * @return
     */
    private LettuceClientConfiguration getLettuceConfig(){
        GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
        poolConfig.setMaxTotal(8);
        poolConfig.setMaxIdle(8);
        poolConfig.setMinIdle(1);
        poolConfig.setMaxWaitMillis(8);
        return  LettucePoolingClientConfiguration.builder().poolConfig(poolConfig).build();
    }

    /**
     * 实例配置
     * @return RedisTemplate
     */
    @Bean("redis_1")
    public RedisTemplate<String, Serializable> redisTemplate() {
        RedisTemplate<String, Serializable> redisTemplate = new RedisTemplate<>();
        redisTemplate.setKeySerializer(new StringRedisSerializer()); // redis 序列化数据key的方式
/* 能与其他语言 相互编码缓存 value编码方式,如果与其他语言混合开发项目,需要获取相同的缓存,
        则使用此种方式编码 */
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);  

        // 另外一种序列化方式
        //redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        LettuceConnectionFactory factory = new LettuceConnectionFactory(getRedisConfig(), getLettuceConfig());
        factory.afterPropertiesSet();
        redisTemplate.setConnectionFactory(factory);
        return redisTemplate;
    }

    /**
     * 发布/订阅
     * RedisMessageListenerContainer提供订阅消息的多路分发,这样多个订阅可以共享同一个Redis连接.
     */
    @Bean
    public RedisMessageListenerContainer redisContainer(LettuceConnectionFactory connectionFactory) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.addMessageListener(new MyMessageListenCommand(), new ChannelTopic("tenmao.blog.channel"));
        return container;
    }

}
# 以上只配置了数据源1 ; 数据源2的配置方法同理, 多写几个配置方法就行

3 . 调用

@Autowired
    @Qualifier("redis_1") // 引用redis1 实例
    RedisTemplate redisTemplate;

public void services(){
      redisTemplate.opsForValue().set("name","xxxxx");
}
上一篇下一篇

猜你喜欢

热点阅读