0


SpringBoot Redis 配置多数据源

Redis 从入门到精通【应用篇】之SpringBoot Redis 配置多数据源

文章目录

在这里插入图片描述
使用 RedisTemplate 支持多个 Redis 数据库

1.教程

0. 添加依赖

在项目中使用 RedisTemplate 支持多个 Redis 数据库之前,需要先添加 Spring Data Redis 的依赖。在 Maven 项目中,可以通过在 pom.xml 文件中添加以下依赖来引入 Spring Data Redis:

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

1. 配置多个 Redis 连接信息

在 Spring Boot 中,可以通过在 application.properties 或 application.yml 文件中指定不同的 Redis 连接信息来配置多个 RedisConnectionFactory 实例,并通过 @Bean 注解将它们注入到 RedisTemplate 中,例如:
Redis的常用配置大概是这些

# Redis 服务器的主机名或 IP 地址spring.redis.host=127.0.0.1

# Redis 服务器的端口号spring.redis.port=6379# Redis 服务器的密码,如果没有设置密码,则为空字符串spring.redis.password=# Redis 数据库的编号,默认为 0spring.redis.database=0# Redis 服务器连接超时时间(毫秒),默认为 5000 毫秒spring.redis.timeout=5000# 连接池最大连接数,即最多允许多少个客户端同时连接到 Redis 服务器
spring.redis.pool.max-active=8# 连接池中最大空闲连接数,即在连接池中最多允许多少个连接处于空闲状态
spring.redis.pool.max-idle=8# 连接池中最小空闲连接数,即在连接池中最少保持多少个连接处于空闲状态
spring.redis.pool.min-idle=0# 连接池最大等待时间(毫秒),即当连接池中的连接全部被占用时,新的连接请求最多等待多长时间# 如果设置为-1,则表示无限等待
spring.redis.pool.max-wait=-1

# 是否启用 SSL 加密连接,默认为 falsespring.redis.ssl=false

我们将上面的配置改造一下,支持Redis多数据源

# 配置 Redis 数据库 0spring.redis.database0.host=127.0.0.1
spring.redis.database0.port=6379spring.redis.database0.password=spring.redis.database0.database=0spring.redis.database0.timeout=5000
spring.redis.database0.pool.max-active=8
spring.redis.database0.pool.max-idle=8
spring.redis.database0.pool.min-idle=0
spring.redis.database0.pool.max-wait=-1
spring.redis.database0.ssl=false

# 配置 Redis 数据库 1spring.redis.database1.host=127.0.0.1
spring.redis.database1.port=6380spring.redis.database1.password=spring.redis.database1.database=1spring.redis.database1.timeout=5000
spring.redis.database1.pool.max-active=8
spring.redis.database1.pool.max-idle=8
spring.redis.database1.pool.min-idle=0
spring.redis.database1.pool.max-wait=-1
spring.redis.database1.ssl=false

2. 配置

 @ConfigurationProperties(prefix = "spring.redis.database0")

@ConfigurationProperties(prefix = "spring.redis.database1") 

注解来将不同的 Redis 配置注入到 Java 类中,例如:

@ConfigurationpublicclassRedisConfig{@Bean(name ="redisTemplate0")publicRedisTemplate<String,Object>redisTemplate0(RedisConnectionFactory redisConnectionFactory0){RedisTemplate<String,Object> redisTemplate =newRedisTemplate<>();
       redisTemplate.setConnectionFactory(redisConnectionFactory0);
       redisTemplate.afterPropertiesSet();return redisTemplate;}@Bean(name ="redisTemplate1")publicRedisTemplate<String,Object>redisTemplate1(RedisConnectionFactory redisConnectionFactory1){RedisTemplate<String,Object> redisTemplate =newRedisTemplate<>();
       redisTemplate.setConnectionFactory(redisConnectionFactory1);
       redisTemplate.afterPropertiesSet();return redisTemplate;}@Bean(name ="redisConnectionFactory0")@ConfigurationProperties(prefix ="spring.redis.database0")publicRedisConnectionFactoryredisConnectionFactory0(){returnnewJedisConnectionFactory();}@Bean(name ="redisConnectionFactory1")@ConfigurationProperties(prefix ="spring.redis.database1")publicRedisConnectionFactoryredisConnectionFactory1(){returnnewJedisConnectionFactory();}}

使用

@ConfigurationProperties(prefix = "spring.redis.database0") 

@ConfigurationProperties(prefix = "spring.redis.database1") 

注解将不同的Redis 配置注入到

RedisConnectionFactory 

实例中,并通过 @Bean 注解将不同的

RedisTemplate 

实例注入到 Spring 容器中。这样,在代码中就可以通过

@Qualifier 

注解来注入不同的

RedisTemplate 

实例,从而访问不同的 Redis 数据库。

3. 创建 RedisTemplate 实例

在 Spring Boot 中,可以通过

@Qualifier

@Autowired

注解将不同的 RedisTemplate 实例注入到 Java 类中,例如:

@Autowired@Qualifier("redisTemplate0")privateRedisTemplate<String,Object> redisTemplate0;@Autowired@Qualifier("redisTemplate1")privateRedisTemplate<String,Object> redisTemplate1;

4. 使用 RedisTemplate 操作 Redis

在 RedisTemplate 中,提供了一系列方法来操作 Redis,例如:

// 存储数据到 Redis 数据库 0
redisTemplate0.opsForValue().set("key0","value0");// 获取数据从 Redis 数据库 0Object value0 = redisTemplate0.opsForValue().get("key0");// 删除数据从 Redis 数据库 0
redisTemplate0.delete("key0");// 存储数据到 Redis 数据库 1
redisTemplate1.opsForValue().set("key1","value1");// 获取数据从 Redis 数据库 1Object value1 = redisTemplate1.opsForValue().get("key1");// 删除数据从 Redis 数据库 1
redisTemplate1.delete("key1");

2. 常见问题

在使用 Spring Boot 中的 Redis 进行多数据源配置时,可能会遇到以下几个常见问题:

2.1. RedisTemplate 实例重名问题

在配置多个 Redis 数据库时,需要为每个 Redis 数据库创建一个 RedisTemplate 实例。如果不同的 RedisTemplate 实例的名称相同,可能会导致实例重名的问题,进而导致应用程序无法启动。为每个 RedisTemplate 实例指定不同的名称。例如,可以在配置类中通过 @Bean 注解为每个 RedisTemplate 实例指定名称

@Bean(name ="redisTemplate0")publicRedisTemplate<String,Object>redisTemplate0(RedisConnectionFactory redisConnectionFactory0){RedisTemplate<String,Object> redisTemplate =newRedisTemplate<>();
    redisTemplate.setConnectionFactory(redisConnectionFactory0);
    redisTemplate.setKeySerializer(newStringRedisSerializer());
    redisTemplate.setValueSerializer(newJackson2JsonRedisSerializer<>(Object.class));
    redisTemplate.afterPropertiesSet();return redisTemplate;}@Bean(name ="redisTemplate1")publicRedisTemplate<String,Object>redisTemplate1(RedisConnectionFactory redisConnectionFactory1){RedisTemplate<String,Object> redisTemplate =newRedisTemplate<>();
    redisTemplate.setConnectionFactory(redisConnectionFactory1);
    redisTemplate.setKeySerializer(newStringRedisSerializer());
    redisTemplate.setValueSerializer(newJackson2JsonRedisSerializer<>(Object.class));
    redisTemplate.afterPropertiesSet();return redisTemplate;}

在上面的代码中,我们分别为两个 RedisTemplate 实例指定了不同的名称,分别为 “redisTemplate0” 和 “redisTemplate1”。

2.2. RedisConnectionFactory 实例重用问题

在配置多个 Redis 数据库时,需要为每个 Redis 数据库创建一个 RedisConnectionFactory 实例。如果多个 RedisConnectionFactory 实例使用了同一个 Redis 连接池,可能会导致实例重用的问题,进而导致应用程序无法启动。可以为每个 RedisConnectionFactory 实例配置不同的 Redis 连接池。例如,可以在配置类中创建不同的 RedisConnectionFactory 实例,并分别为它们配置不同的 Redis 连接池

@Bean(name ="redisConnectionFactory0")publicRedisConnectionFactoryredisConnectionFactory0(){RedisStandaloneConfiguration config =newRedisStandaloneConfiguration();
    config.setHostName("localhost");
    config.setPort(6379);
    config.setPassword(RedisPassword.of("password"));LettuceConnectionFactory connectionFactory =newLettuceConnectionFactory(config);
    connectionFactory.setDatabase(0);
    connectionFactory.afterPropertiesSet();return connectionFactory;}@Bean(name ="redisConnectionFactory1")publicRedisConnectionFactoryredisConnectionFactory1(){RedisStandaloneConfiguration config =newRedisStandaloneConfiguration();
    config.setHostName("localhost");
    config.setPort(6379);
    config.setPassword(RedisPassword.of("password"));LettuceConnectionFactory connectionFactory =newLettuceConnectionFactory(config);
    connectionFactory.setDatabase(1);
    connectionFactory.afterPropertiesSet();return connectionFactory;}

2.3. 数据库编号配置问题

在配置多个 Redis 数据库时,需要为每个 Redis 数据库指定不同的数据库编号。如果多个 Redis 数据库使用了同一个数据库编号,可能会导致数据被覆盖或丢失。为了解决这个问题,可以为每个 RedisConnectionFactory 实例配置不同的数据库编号。例如,可以在 RedisStandaloneConfiguration 中指定不同的数据库编号

@Bean(name ="redisConnectionFactory0")publicRedisConnectionFactoryredisConnectionFactory0(){RedisStandaloneConfiguration config =newRedisStandaloneConfiguration();
    config.setHostName("localhost");
    config.setPort(6379);
    config.setPassword(RedisPassword.of("password"));
    config.setDatabase(0);LettuceConnectionFactory connectionFactory =newLettuceConnectionFactory(config);
    connectionFactory.afterPropertiesSet();return connectionFactory;}@Bean(name ="redisConnectionFactory1")publicRedisConnectionFactoryredisConnectionFactory1(){RedisStandaloneConfiguration config =newRedisStandaloneConfiguration();
    config.setHostName("localhost");
    config.setPort(6379);
    config.setPassword(RedisPassword.of("password"));
    config.setDatabase(1);LettuceConnectionFactory connectionFactory =newLettuceConnectionFactory(config);
    connectionFactory.afterPropertiesSet();return connectionFactory;}

2.4. RedisTemplate 序列化问题

在使用 RedisTemplate 时,需要对数据进行序列化和反序列化。如果不同的 Redis 数据库使用了不同的序列化方式,可能会导致数据无法正常读写。每个 RedisTemplate 实例指定不同的序列化器。例如,可以为每个 RedisTemplate 实例分别设置不同的 keySerializer 和 valueSerializer 。但是通常情况下我们的的项目中的序列化方式都是一致的,除非是在连别的项目的Redis时候人家已经按自己的序列化方式将值已经写入,我们只能按照对接方的方式配置序列化。

@Bean(name ="redisTemplate0")publicRedisTemplate<String,Object>redisTemplate0(RedisConnectionFactory redisConnectionFactory0){RedisTemplate<String,Object> redisTemplate =newRedisTemplate<>();
    redisTemplate.setConnectionFactory(redisConnectionFactory0);
    redisTemplate.setKeySerializer(newStringRedisSerializer());
    redisTemplate.setValueSerializer(newJackson2JsonRedisSerializer<>(Object.class));
    redisTemplate.afterPropertiesSet();return redisTemplate;}@Bean(name ="redisTemplate1")publicRedisTemplate<String,Object>redisTemplate1(RedisConnectionFactory redisConnectionFactory1){RedisTemplate<String,Object> redisTemplate =newRedisTemplate<>();
    redisTemplate.setConnectionFactory(redisConnectionFactory1);
    redisTemplate.setKeySerializer(newStringRedisSerializer());
    redisTemplate.setValueSerializer(newGenericJackson2JsonRedisSerializer());
    redisTemplate.afterPropertiesSet();return redisTemplate;}

3. Redis从入门到精通系列文章

  • 《Redis【应用篇】之RedisTemplate基本操作》
  • 《Redis 从入门到精通【实践篇】之SpringBoot配置Redis多数据源》
  • 《Redis 从入门到精通【进阶篇】之三分钟了解Redis HyperLogLog 数据结构》
  • 《Redis 从入门到精通【进阶篇】之三分钟了解Redis地理位置数据结构GeoHash》
  • 《Redis 从入门到精通【进阶篇】之高可用哨兵机制(Redis Sentinel)详解》
  • 《Redis 从入门到精通【进阶篇】之redis主从复制详解》
  • 《Redis 从入门到精通【进阶篇】之Redis事务详解》
  • 《Redis从入门到精通【进阶篇】之对象机制详解》
  • 《Redis从入门到精通【进阶篇】之消息传递发布订阅模式详解》
  • 《Redis从入门到精通【进阶篇】之持久化 AOF详解》
  • 《Redis从入门到精通【进阶篇】之持久化RDB详解》
  • 《Redis从入门到精通【高阶篇】之底层数据结构字典(Dictionary)详解》
  • 《Redis从入门到精通【高阶篇】之底层数据结构快表QuickList详解》
  • 《Redis从入门到精通【高阶篇】之底层数据结构简单动态字符串(SDS)详解》
  • 《Redis从入门到精通【高阶篇】之底层数据结构压缩列表(ZipList)详解》
  • 《Redis从入门到精通【进阶篇】之数据类型Stream详解和使用示例》在这里插入图片描述大家好,我是冰点,今天的Redis【实践篇】之SpringBoot Redis 配置多数据源,全部内容就是这些。如果你有疑问或见解可以在评论区留言。
标签: spring boot redis java

本文转载自: https://blog.csdn.net/wangshuai6707/article/details/131837051
版权归原作者 算.子 所有, 如有侵权,请联系我们删除。

“SpringBoot Redis 配置多数据源”的评论:

还没有评论