配置多redis数据源

12 篇文章 0 订阅

问题:

springboot2.x版本之后
一个spring服务需要操作多个redis服务或者同一redis服务下的不同database

解决思路:

1在配置中添加多个redis配置
2建立对应的多个RedisConnectionFactory
3对应每个RedisConnectionFactory配置redisTemplate设置(如Serializer等)并关联factory

实战:

1在yml里添加redis配置

Spring:
	 redis:
	    database: 1
	    # Redis服务器地址
	    host: 127.0.0.1
	    # Redis服务器连接端口
	    port: 6379
	    # Redis服务器连接密码(默认为空)
	    password:
	    # 连接池最大连接数(使用负值表示没有限制)
	    # 连接超时时间(毫秒)
	    timeout: 5000ms
	    jedis:
	      pool:
	        max-active: 80
	        # 连接池最大阻塞等待时间(使用负值表示没有限制)
	        max-wait: -1s
	        # 连接池中的最大空闲连接
	        max-idle: 8
	        # 连接池中的最小空闲连接
	        min-idle: 0
	  redis2:
	    database: 0
	    # Redis服务器地址
	    host: 127.0.0.1
	    # Redis服务器连接端口
	    port: 6379
	    # Redis服务器连接密码(默认为空)
	    password:
	    timeout: 5000

2配置多个factory和redistemplate (此处展示使用同一redis服务不同database)

package com.;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Qualifier;
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.context.annotation.Primary;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisPassword;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.jedis.JedisClientConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.time.Duration;

/**
 * 其他服务使用的redis 0数据库
 */
@Configuration
@EnableCaching
public class MainRedisConf {

    @Value("${spring.redis2.database}")
    private Integer database;
    @Value("${spring.redis2.host}")
    private String host;
    @Value("${spring.redis2.port}")
    private Integer port;
    @Value("${spring.redis2.password}")
    private String password;

    @Bean(name="factory2")
    RedisConnectionFactory jedisConnectionFactory() {
        RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
        redisStandaloneConfiguration.setHostName(host);
        redisStandaloneConfiguration.setPort(port);
        redisStandaloneConfiguration.setDatabase(database);
        redisStandaloneConfiguration.setPassword(RedisPassword.of(password));

        JedisClientConfiguration.JedisClientConfigurationBuilder jedisClientConfiguration = JedisClientConfiguration.builder();
        jedisClientConfiguration.connectTimeout(Duration.ofSeconds(5));// 5s connection timeout

        JedisConnectionFactory jedisConFactory = new JedisConnectionFactory(redisStandaloneConfiguration,
                jedisClientConfiguration.build());

        return jedisConFactory;
    }

    @Bean(name = "mainRedisTemplate")
    public RedisTemplate<String, Object> redisTemplate1(@Qualifier("factory2")RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        // 将刚才的redis连接工厂设置到模板类中
        template.setConnectionFactory(factory);
        // 设置key的序列化器
        template.setKeySerializer(new StringRedisSerializer());
        // 设置value的序列化器
        //使用Jackson 2,将对象序列化为JSON
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        //json转对象类,不设置默认的会将json转成hashmap
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        template.setValueSerializer(jackson2JsonRedisSerializer);

        return template;
    }
}

package com.;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Qualifier;
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.context.annotation.Primary;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisPassword;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.jedis.JedisClientConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.time.Duration;

/**
 * ssp服务使用的 1数据库
 */
@Configuration
@EnableCaching
public class SspRedisConf {

    @Value("${spring.redis.database}")
    private Integer database;
    @Value("${spring.redis.host}")
    private String host;
    @Value("${spring.redis.port}")
    private Integer port;
    @Value("${spring.redis.password}")
    private String password;

    @Bean(name="factory")
    @Primary
    RedisConnectionFactory jedisConnectionFactory() {

        RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
        redisStandaloneConfiguration.setHostName(host);
        redisStandaloneConfiguration.setPort(port);
        redisStandaloneConfiguration.setDatabase(database);
        redisStandaloneConfiguration.setPassword(RedisPassword.of(password));

        JedisClientConfiguration.JedisClientConfigurationBuilder jedisClientConfiguration = JedisClientConfiguration.builder();
        jedisClientConfiguration.connectTimeout(Duration.ofSeconds(5));// 5s connection timeout

        JedisConnectionFactory jedisConFactory = new JedisConnectionFactory(redisStandaloneConfiguration,
                jedisClientConfiguration.build());

        return jedisConFactory;
    }

    /**
     * RedisTemplate配置
     */
    @Bean(name = "sspRedisTemplate")
    public RedisTemplate<String, String> redisTemplate(@Qualifier("factory") RedisConnectionFactory factory) {
        RedisTemplate template = new StringRedisTemplate(factory);
        RedisSerializer stringSerializer = new StringRedisSerializer();
        //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);//json转对象时 对象无该属性不报错

        jackson2JsonRedisSerializer.setObjectMapper(om);


        //使用StringRedisSerializer来序列化和反序列化redis的key值
        template.setKeySerializer(stringSerializer);
        template.setValueSerializer(jackson2JsonRedisSerializer);
        template.setHashKeySerializer(stringSerializer);
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }
}

3JUNIT中的使用

	@Resource(name = "sspRedisTemplate")
	RedisTemplate redisTemplate;
	@Resource(name = "mainRedisTemplate")
	RedisTemplate redisTemplate2;

references:
https://cloud.tencent.com/developer/article/1441532
https://cloud.tencent.com/developer/article/1430628
https://www.cnblogs.com/ccubee/p/12633639.html

Java中,配置多个Redis数据源通常是为了分布式系统的设计,每个数据源可以连接到不同的Redis实例,以实现读写分离、高可用等需求。Spring Boot提供了一个方便的方式来管理这样的场景,你可以使用`@ConfigurationProperties`和`@Bean`注解来创建多个RedisTemplate实例。 首先,你需要添加Spring Data Redis依赖,并创建一个配置类: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; @Configuration public class RedisConfig { @Bean public JedisConnectionFactory primaryDataSource() { // 配置数据源Redis连接信息,比如localhost:6379 return new JedisConnectionFactory(); } @Bean public JedisConnectionFactory secondaryDataSource() { // 配置备选数据源Redis连接信息,如localhost:6380 return new JedisConnectionFactory(); } @Bean public RedisTemplate<String, String> primaryRedisTemplate(JedisConnectionFactory factory) { RedisTemplate<String, String> template = new RedisTemplate<>(); template.setConnectionFactory(factory); return template; } @Bean public RedisTemplate<String, String> secondaryRedisTemplate(JedisConnectionFactory factory) { RedisTemplate<String, String> template = new RedisTemplate<>(); template.setConnectionFactory(factory); return template; } } ``` 然后,在需要使用数据源的地方,你可以通过`@Qualifier`来指定特定的数据源: ```java @Autowired @Qualifier("primaryRedisTemplate") private RedisTemplate<String, String> primaryTemplate; @Autowired @Qualifier("secondaryRedisTemplate") private RedisTemplate<String, String> secondaryTemplate; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值