SpringBoot Redis 配置多数据源

news2024/11/26 11:34:49

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

文章目录

  • Redis 从入门到精通【应用篇】之SpringBoot Redis 配置多数据源
  • 1.教程
    • 0. 添加依赖
    • 1. 配置多个 Redis 连接信息
      • 我们将上面的配置改造一下,支持Redis多数据源
    • 2. 配置
    • 3. 创建 RedisTemplate 实例
    • 4. 使用 RedisTemplate 操作 Redis
  • 2. 常见问题
    • 2.1. RedisTemplate 实例重名问题
    • 2.2. RedisConnectionFactory 实例重用问题
    • 2.3. 数据库编号配置问题
    • 2.4. RedisTemplate 序列化问题
  • 3. 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 数据库的编号,默认为 0
spring.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 加密连接,默认为 false
spring.redis.ssl=false

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

# 配置 Redis 数据库 0
spring.redis.database0.host=127.0.0.1
spring.redis.database0.port=6379
spring.redis.database0.password=
spring.redis.database0.database=0
spring.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 数据库 1
spring.redis.database1.host=127.0.0.1
spring.redis.database1.port=6380
spring.redis.database1.password=
spring.redis.database1.database=1
spring.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 类中,例如:

@Configuration
public class RedisConfig {

   @Bean(name = "redisTemplate0")
   public RedisTemplate<String, Object> redisTemplate0(RedisConnectionFactory redisConnectionFactory0) {
       RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
       redisTemplate.setConnectionFactory(redisConnectionFactory0);
       redisTemplate.afterPropertiesSet();
       return redisTemplate;
   }

   @Bean(name = "redisTemplate1")
   public RedisTemplate<String, Object> redisTemplate1(RedisConnectionFactory redisConnectionFactory1) {
       RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
       redisTemplate.setConnectionFactory(redisConnectionFactory1);
       redisTemplate.afterPropertiesSet();
       return redisTemplate;
   }

   @Bean(name = "redisConnectionFactory0")
   @ConfigurationProperties(prefix = "spring.redis.database0")
   public RedisConnectionFactory redisConnectionFactory0() {
       return new JedisConnectionFactory();
   }

   @Bean(name = "redisConnectionFactory1")
   @ConfigurationProperties(prefix = "spring.redis.database1")
   public RedisConnectionFactory redisConnectionFactory1() {
       return new JedisConnectionFactory();
   }
}

使用 @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")
private RedisTemplate<String, Object> redisTemplate0;

@Autowired
@Qualifier("redisTemplate1")
private RedisTemplate<String, Object> redisTemplate1;

4. 使用 RedisTemplate 操作 Redis

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

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

// 存储数据到 Redis 数据库 1
redisTemplate1.opsForValue().set("key1", "value1");
// 获取数据从 Redis 数据库 1
Object 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")
public RedisTemplate<String, Object> redisTemplate0(RedisConnectionFactory redisConnectionFactory0) {
    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(redisConnectionFactory0);
    redisTemplate.setKeySerializer(new StringRedisSerializer());
    redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
    redisTemplate.afterPropertiesSet();
    return redisTemplate;
}

@Bean(name = "redisTemplate1")
public RedisTemplate<String, Object> redisTemplate1(RedisConnectionFactory redisConnectionFactory1) {
    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(redisConnectionFactory1);
    redisTemplate.setKeySerializer(new StringRedisSerializer());
    redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
    redisTemplate.afterPropertiesSet();
    return redisTemplate;
}

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

2.2. RedisConnectionFactory 实例重用问题

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

@Bean(name = "redisConnectionFactory0")
public RedisConnectionFactory redisConnectionFactory0() {
    RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
    config.setHostName("localhost");
    config.setPort(6379);
    config.setPassword(RedisPassword.of("password"));
    LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(config);
    connectionFactory.setDatabase(0);
    connectionFactory.afterPropertiesSet();
    return connectionFactory;
}

@Bean(name = "redisConnectionFactory1")
public RedisConnectionFactory redisConnectionFactory1() {
    RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
    config.setHostName("localhost");
    config.setPort(6379);
    config.setPassword(RedisPassword.of("password"));
    LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(config);
    connectionFactory.setDatabase(1);
    connectionFactory.afterPropertiesSet();
    return connectionFactory;
}

2.3. 数据库编号配置问题

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

@Bean(name = "redisConnectionFactory0")
public RedisConnectionFactory redisConnectionFactory0() {
    RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
    config.setHostName("localhost");
    config.setPort(6379);
    config.setPassword(RedisPassword.of("password"));
    config.setDatabase(0);
    LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(config);
    connectionFactory.afterPropertiesSet();
    return connectionFactory;
}

@Bean(name = "redisConnectionFactory1")
public RedisConnectionFactory redisConnectionFactory1() {
    RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
    config.setHostName("localhost");
    config.setPort(6379);
    config.setPassword(RedisPassword.of("password"));
    config.setDatabase(1);
    LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(config);
    connectionFactory.afterPropertiesSet();
    return connectionFactory;
}

2.4. RedisTemplate 序列化问题

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

@Bean(name = "redisTemplate0")
public RedisTemplate<String, Object> redisTemplate0(RedisConnectionFactory redisConnectionFactory0) {
    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(redisConnectionFactory0);
    redisTemplate.setKeySerializer(new StringRedisSerializer());
    redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
    redisTemplate.afterPropertiesSet();
    return redisTemplate;
}

@Bean(name = "redisTemplate1")
public RedisTemplate<String, Object> redisTemplate1(RedisConnectionFactory redisConnectionFactory1) {
    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(redisConnectionFactory1);
    redisTemplate.setKeySerializer(new StringRedisSerializer());
    redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
    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 配置多数据源,全部内容就是这些。如果你有疑问或见解可以在评论区留言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/782216.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Compose中常用的一些Modifier的扩展ui方法记录

Compose中常用的一些Modifier的扩展ui方法记录 关于防快速点击虚实分割线虚线边框阴影 关于 本篇主要记录一些开发中可能用到的常用方法的扩展记录&#xff0c;包括防快速带点击&#xff0c;画虚实线divider&#xff0c;画虚线边框&#xff0c;绘制阴影等。 防快速点击 inlin…

每天五分钟机器学习:线性回归和非线性回归之间的区别?

本文重点 在前面的课程中,我们学习了单变量线性回归模型以及多变量的线性回归模型,无论是单变量线性回归还是多变量线性回归,这二者都是一样的,都是线性的。本文我们将学习一下线性回归模型和非线性回归之间的区别和联系。 关于模型的基本区别 线性回归:线性回归就是每…

第三天 运维高级 MySQL主从复制

1.理解MySQL主从复制原理 1、master&#xff08;binlog dump thread&#xff09;主要负责Master库中有数据更新的时候&#xff0c;会按照binlog格式&#xff0c;将更新的事件类型写入到主库的binlog文件中。 2、I/O thread线程在Slave中创建&#xff0c;该线程用于请求Master&…

YApi 服务端测试新增 globalCookie ,兼容自动化触发服务端测试功能

YApi是一个开源的接口管理平台&#xff0c;它提供了丰富的接口管理和测试功能。其中&#xff0c;服务端测试是YApi的一个重要特性&#xff0c;可以帮助开发人员自动化执行接口测试。 在YApi的服务端测试中&#xff0c;新增globalCookie是一个很有用的功能。通过设置globalCook…

2023/7/23周报

目录 摘要 论文阅读 1、题目和现存问题 2、问题阐述及相关定义 3、LGDL模型框架 4、实验准备 5、实验过程 深度学习 1、GCN简单分类任务 2、文献引用数据分类案例 3、将时序型数据构建为图数据格式 总结 摘要 本周在论文阅读上&#xff0c;对基于图神经网络与深度…

LabVIEW使用支持向量机对脑磁共振成像进行图像分类

LabVIEW使用支持向量机对脑磁共振成像进行图像分类 医学成像是用于创建人体解剖学图像以进行临床研究、诊断和治疗的技术和过程。它现在是医疗技术发展最快的领域之一。通常用于获得医学图像的方式是X射线&#xff0c;计算机断层扫描&#xff08;CT&#xff09;&#xff0c;磁…

pnpm 与monorepo架构

软链接与硬链接 创建方式&#xff1a; mklink &#xff08;windows&#xff09; 软链接 &#xff1a; a、b指向同一个文件 b相当于一个快捷方式 硬链接&#xff1a; a、b指向同一个内存地址 某一文件修改&#xff0c;其他文件跟这变化 上图所示&#xff1a;安装某依赖&…

LabVIEW - DAQmx 数据采集

1. 题目 基于NI MAX创建模拟仿真设备&#xff0c;然后基于DAQmx编写模拟量数据采集程序&#xff0c;实现按照1s时间间隔&#xff0c;采集制定模拟输入端口一个数据的功能&#xff0c;并能够将采集的数据、数据采集的时间等参数写入文本文件保存。 2. 过程 通过在NI max的设备与…

虚拟人直播怎么做?3d虚拟主播全栈技术方案来了

元宇宙浪潮来袭后&#xff0c;虚拟人直播的应用场景得到进一步拓宽&#xff0c;大量的3d虚拟主播出现在品牌直播间、娱乐节目、发布会等应用中&#xff0c;那想要让3d虚拟主播“活得即时”&#xff0c;开启虚拟人直播要怎么做&#xff1f;本文将基于广州虚拟动力的3d虚拟主播全…

AWS IAM介绍

前言 AWS是世界上最大的云服务提供商&#xff0c;它提供了很多组件供消费者使用&#xff0c;其中进行访问控制的组件叫做IAM(Identity and Access Management)&#xff0c; 用来进行身份验证和对AWS资源的访问控制。 功能 IAM的功能总结来看&#xff0c;主要分两种&#xff1…

3、线性数据结构

线性数据结构&#xff0c;从名字可以看出&#xff0c;和“线”脱离不了关系。 那么从“线”联想&#xff0c;水平的&#xff0c;我们可以想到食堂打饭排的队伍&#xff0c;垂直的&#xff0c;我们可以联想到书桌上层叠摆放的书籍。 打饭的队伍一般遵循“先来先服务”的原则&a…

力扣热门100题之移动0【中等】

题目描述 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2: 输入: nums […

利用Graphics的CopyFromScreen实现简陋版的打印(C#)

前段时间&#xff0c;在做一个打印的需求&#xff0c;需要把Winform界面的控件及内容全部打印出来&#xff0c;但有一个比较坑的地方是&#xff0c;公司提供的打印API打印单选框&#xff0c;打印单选框时发现选框和内容总是有那么一点点不对齐&#xff0c;看着很别扭。不过客户…

【Linux】文件操作(一)

目录 预备知识 复习C语言文件接口 fopen() 写入类&#xff1a;fwrite()、fprintf()、fputs() 读取类&#xff1a;fgets() 系统接口 open() 一个参数如何传递多个选项&#xff1f; close() write() read() 预备知识 在正式讲解文件之前&#xff0c;我们需要有一些预…

C#中小数保留固定位数

我们写程序的时候&#xff0c;有时候数据想要对齐一点&#xff0c;如果小数位数不一样&#xff0c;自然就对不齐了。这里提供一个方法. 1.这里举例保留小数点后4位(不足4位后面补0)。 String result String.Format("{0:F4}", 123.456); 输出结果为result123.4560&a…

Linux离线安装mysql8.0+

文章目录 1.查看是否安装过MySQL2.MySQL卸载3.下载mysql4.上传mysql到指定目录5.解压MySQL安装包6.安装1.准备工作2.开始安装3.查看MySQL版本 7.修改my.cnf配置文件8.授权给mysql用户8.服务初始化10.启动MySQL11.登录12.修改密码13.设置远程登录1连接超时问题2确认网络3查看端口…

STL vector 详解

STL vector 详解 STL vector 详解 STL vector 详解一级目录二级目录三级目录 1. vector容器2. vector 容器的初始化函数1.初始化2.案例 3. vector的访问函数1. 成员函数访问2. 操作符[ ]访问3.案例 4. vector的插入函数1. 语法2. 案例 5. vector的删除函数1.语法2. 案例 6. vec…

Vue el-table 多表格联合显示、合并单元格

原型图 分析 先看内容是三个表&#xff0c;每个表的合并单元格都有点不同。 按照原型图给的内容&#xff0c;第一个是两列&#xff0c;有行合并和列合并&#xff0c;还有表头行合并。 现根据图造出mock数据&#xff0c;然后再写对应的代码。 export const columnVarsData {s…

数据结构day7(2023.7.21)

一、Xmind整理&#xff1a; 二、课上练习&#xff1a; 练习1&#xff1a;折半查找/二分查找 1-------100 key8850---10075-100int arr[]{12,23,33,45,66,78,99};key7912,23,33,45,66,78,990 6low mid high66, 78, 99mid1 mid highlow99lowhigh…

进程间的通信之管道(匿名管道)

文章目录 进程间通信&#xff08;IPC&#xff09;管道管道特点为什么可以使用管道进行进程间通信管道数据结构匿名管道的使用 管道实例管道读写特点管道设置非阻塞 进程间通信&#xff08;IPC&#xff09; inter process conmmunication &#x1f447;&#x1f447;&#x1f…