SpringBoot配置多Redis数据源

最近在项目中用到了两个Redis数据源,特此记录一下

一. 添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>

二. application.yml 配置

 例如此处,order 和 user 两个不同的 redis数据源配置信息

spring:
  redis:
    order:
      host: 100.99.202.32
      port: 6379
      password: NoLife
    user:
      host: 100.91.221.35
      port: 9000
      password: NoGame

三.  

   注意,redisOrderTemplate 和 redisUserTemplate,注入不同的数据源

@Configuration
public class RedisTemplateConfig {
    //order
    @Value("${spring.redis.order.host}")
    private String orderHost;

    @Value("${spring.redis.order.port}")
    private String orderPort;

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

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

    @Value("${spring.redis.user.port}")
    private String userPort;

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

    private static final int MAX_IDLE = 200; //最大空闲连接数
    private static final int MAX_TOTAL = 1024; //最大连接数
    private static final long MAX_WAIT_MILLIS = 10000; //建立连接最长等待时间


    //配置工厂
    public RedisConnectionFactory connectionFactory(String host, int port, String password, int maxIdle,
                                                    int maxTotal, long maxWaitMillis, int index) {
        JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
        jedisConnectionFactory.setHostName(host);
        jedisConnectionFactory.setPort(port);

        if (!StringUtils.isEmpty(password)) {
            jedisConnectionFactory.setPassword(password);
        }

        if (index != 0) {
            jedisConnectionFactory.setDatabase(index);
        }

        jedisConnectionFactory.setPoolConfig(poolConfig(maxIdle, maxTotal, maxWaitMillis, false));
        jedisConnectionFactory.afterPropertiesSet();
        return jedisConnectionFactory;
    }

    //连接池配置
    public JedisPoolConfig poolConfig(int maxIdle, int maxTotal, long maxWaitMillis, boolean testOnBorrow) {
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setMaxIdle(maxIdle);
        poolConfig.setMaxTotal(maxTotal);
        poolConfig.setMaxWaitMillis(maxWaitMillis);
        poolConfig.setTestOnBorrow(testOnBorrow);
        return poolConfig;
    }


    //------------------------------------
    @Bean(name = "redisOrderTemplate")
    public StringRedisTemplate redisOrderTemplate() {
        StringRedisTemplate template = new StringRedisTemplate();
        template.setConnectionFactory(
                connectionFactory(orderHost, Integer.parseInt(orderPort), orderPassword, MAX_IDLE, MAX_TOTAL, MAX_WAIT_MILLIS, 0));
        return template;
    }

    //------------------------------------
    @Bean(name = "redisUserTemplate")
    public StringRedisTemplate userUserTemplate() {
        StringRedisTemplate template = new StringRedisTemplate();
        template.setConnectionFactory(
                connectionFactory(userHost, Integer.parseInt(userPort), userPassword, MAX_IDLE, MAX_TOTAL, MAX_WAIT_MILLIS, 0));
        return template;
    }
}

四. 分别调用

    @Resource(name = "redisOrderTemplate")
    StringRedisTemplate redisOrderTemplate;

    @Resource(name = "redisUserTemplate")
    StringRedisTemplate redisUserTemplate;

对 StringRedisTemplate 的操作极为简单

可参考如下文章即可,不再多余描述

https://blog.csdn.net/m0_37834446/article/details/82224714

五. 额外:当存储数据的key value为json格式时

     需对key 和value  进行序列化设置

     首先,在pom.xml中引入 fastjson 依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.58</version>
</dependency>

     其次, 在 标题 三 的 RedisTemplateConfig 中,添加序列化方法.  需序列化时调用即可

public void redisSerializeConfig(StringRedisTemplate template) {
        Jackson2JsonRedisSerializer<Object> redisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        redisSerializer.setObjectMapper(om);

        template.setKeySerializer(stringRedisSerializer);
        template.setValueSerializer(redisSerializer);
        template.setHashKeySerializer(stringRedisSerializer);
        template.setHashValueSerializer(redisSerializer);
        //template.afterPropertiesSet();
    }

 


版权声明:本文为sss1342746626原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。