详解 Spring Boot 的 RedisAutoConfiguration 配置

news2024/9/30 12:29:11

引言

带大家分析 Spring Boot 内置的有关 Redis 的自动配置类【RedisAutoConfiguration】。

1. Spring Data Redis

Spring Data Redis 是 Spring Data 家族的一部分,它提供了从 Spring 应用程序中轻松配置和访问 Redis 的功能。

我们来看看官方介绍的特性:

  • 连接包作为多个 Redis 驱动程序( Lettuce 和 Jedis )的低级别抽象。

  • 将 Redis 驱动程序异常转换为 Spring 的可移植数据访问异常层次结构。

  • 提供各种 Redis 操作、异常转换和序列化支持的 RedisTemplate

  • 支持发布订阅(例如用于消息驱动 POJO 的消息监听器容器)。

  • 支持 Redis Sentinel 和 Redis Cluster

  • 使用 Lettuce 驱动程序的响应式 API

  • 支持 JDKStringJSON 和 Spring 对象 / XML 映射序列化器。

  • 在 Redis 上实现 JDK 集合。

  • 支持原子计数器类。

  • 支持排序和管道功能。

  • 专用于 SORTSORT/GET 模式和支持返回批量值的功能。

  • 为 Spring 缓存抽象提供 Redis 实现。

  • 自动实现 Repository 接口,包括使用 @EnableRedisRepositories 支持自定义查询方法。

  • 对存储库提供 CDI 支持。

在 Spring Data Redis 中,我们可以直接使用 RedisTemplate 及其相关的类来操作 Redis。虽然 RedisConnection 提供了接受和返回二进制值(字节数组)的低级方法,但 RedisTemplate 负责序列化和连接管理,使用户可以无需处理这些细节。

RedisTemplate 还提供了操作视图(按照 Redis 命令参考进行分组),这些视图提供了丰富、通用的接口,用于针对特定类型或特定键进行操作(通过 KeyBound 接口实现),如下表所示:

下面我们来看看相关的 Spring 配置:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:p="http://www.springframework.org/schema/p"  xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
  <bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/>  <!-- redis 模板定义 -->  <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnFactory"/>
</beans>

复制代码

一旦配置完成,Redis 模板就是线程安全的,并且可以在多个实例之间重用。

RedisTemplate 使用基于 Java 的序列化器进行大部分操作。也就意味着通过模板写入或读取的任何对象都是通过 Java 进行序列化和反序列化的。

我们也可以更改模板上的序列化机制,可以添加如下配置:

<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">    <property name="connectionFactory" ref="redisConnectionFactory"/>    <property name="keySerializer">        <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>    </property>    <property name="valueSerializer">        <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>    </property>    <property name="hashKeySerializer">        <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>    </property>    <property name="hashValueSerializer">        <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>    </property></bean>

复制代码

而 Redis 模块提供了几个序列化器的实现,有关这些实现大家可以查看 org.springframework.data.redis.serializer 包。

还可以将任何序列化程序设置为 null,并通过设置 enableDefaultSerializer 属性为 false 来使用 RedisTemplate 与原始字节数组一起使用。

注意: 模板要求所有键都不为空。但是,只要底层序列化程序接受值,值就可以为空。

下面我们可以注入 RedisTemplate,并调用 RedisTemplate 的方法进行存储、查询、删除等操作。

@Autowiredprivate RedisTemplate<String, Object> redisTemplate;// 存储数据redisTemplate.opsForValue().set("key", "value");// 查询数据Object value = redisTemplate.opsForValue().get("key");// 删除数据redisTemplate.delete("key");

复制代码

对于需要特定模板视图的情况,声明视图作为依赖项并注入模板。容器会自动执行转换,消除 opsFor[X] 调用,如下所示的示例:

public class Example {		// inject the template as ListOperations	@Resource(name="redisTemplate")	private ListOperations<String, String> listOps;		public void addLink(String userId, URL url) {	  listOps.leftPush(userId, url.toExternalForm());	}}

复制代码

当然 Spring Data Redis 肯定不止上述这些,有需要深入了解的读者们,请看如下:

参考: Spring Data Redis 官方文档

2. RedisAutoConfiguration

那么 Spring Data Redis 的 RedisTemplate 的自动配置在 Spring Boot 是如何实现的呢?

Spring Boot 是通过内置的 RedisAutoConfiguration 配置类来完成这一功能。下面我们具体分析一下:

注意: 以下涉及 Spring Boot 源码 均来自版本 2.7.9,其他版本有所出入,可自行查看源码。

2.1 加载自动配置组件

从之前的《【Spring Boot 源码学习】自动装配流程源码解析(上)》中,我们知道 Spring Boot 内部针对自动配置类,会读取如下两个配置文件:

  • META-INF/spring.factories

  • META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

实际上 在 Spring Boot 2.7.9 版本中, Spring Boot 自己内部的 META-INF/spring.factories 中有关自动配置的注册类的配置信息已经被去除掉了,不过其他外围的 jar 中可能有自己的 META-INF/spring.factories 文件,它里面也有关于自动配置注册类的配置信息;

而 Spring Boot 内置的 RedisAutoConfiguration 配置类,则是配置在上述的第二个配置文件 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 中。

2.2 过滤自动配置组件

上述自动配置加载完之后,就来到了 《【Spring Boot 源码学习】自动装配流程源码解析(下)》 介绍的 过滤自动配置组件 逻辑。

这部分数据对应的配置内容在 META-INF/spring-autoconfigure-metadata.properties 文件中:

org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration=org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration.ConditionalOnClass=org.springframework.data.redis.core.RedisOperations

复制代码

显然这里涉及到了 ConditionalOnClass 注解,我们翻看 RedisAutoConfiguration 配置类的源码,如下:

@AutoConfiguration@ConditionalOnClass(RedisOperations.class)@EnableConfigurationProperties(RedisProperties.class)@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })public class RedisAutoConfiguration {
	@Bean	@ConditionalOnMissingBean(name = "redisTemplate")	@ConditionalOnSingleCandidate(RedisConnectionFactory.class)	public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {		// 。。。	}
	@Bean	@ConditionalOnMissingBean	@ConditionalOnSingleCandidate(RedisConnectionFactory.class)	public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {		// 。。。	}
}

复制代码

2.2.1 涉及注解

我们先来看看上述 RedisAutoConfiguration 配置类涉及到的注解,如下:

  • @AutoConfiguration : 该类是一个自动配置类,Spring Boot 会根据项目中的依赖自动配置这个类的实例。

  • @ConditionalOnClass(RedisOperations.class) :只有在项目中引入了 RedisOperations 类(通常由 spring-data-redis 库提供)的情况下,才会加载这个配置类。

  • @EnableConfigurationProperties(RedisProperties.class) :启用 RedisProperties 类作为配置属性。这样,我们就可以在 application.properties 或 application.yml 文件中定义 Redis 的相关配置。

  • @Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class }) :导入注解,表示导入 LettuceConnectionConfiguration 和 JedisConnectionConfiguration 这两个类。这两个类通常用于配置 Redis 连接的具体实现,例如使用 Lettuce 还是 Jedis 等。

  • @Bean :用于声明一个方法创建的对象是一个 Spring 管理的 BeanSpring 容器会自动管理这个 Bean 的生命周期,包括依赖注入、初始化和销毁等。

  • @ConditionalOnMissingBean :只有在当前 Spring 容器中不存在指定类型的 Bean 时,才会执行被注解的方法。这样可以用于确保在需要的时候才创建某个 Bean,避免重复创建。

  • @ConditionalOnSingleCandidate:只有在当前上下文中存在且只有一个指定类型的 bean 候选者时,才会创建这个 bean

2.2.2 RedisProperties

其中 RedisProperties 类的属性值对应着 application.yml 或 application.properties 中的配置,通过注解 @ConfigurationProperties(prefix = "spring.redis") 实现的属性注入。

有关属性注入的内容后续笔者会另外介绍,我们先来看看 RedisProperties 类相关的部分源码 和 对应的配置参数:

@ConfigurationProperties(prefix = "spring.redis")public class RedisProperties {
	// 。。。
	// Redis 服务器主机地址.	private String host = "localhost";		// 。。。
	// Redis 服务器的端口	private int port = 6379;
	private Sentinel sentinel;
	private Cluster cluster;
	private final Jedis jedis = new Jedis();
	private final Lettuce lettuce = new Lettuce();
	// Redis 连接池配置	public static class Pool {		// 。。。	}	// Redis 集群配置	public static class Cluster {		// 。。。	}	// Redis 哨兵配置	public static class Sentinel {		// 。。。	}	// Jedis 客户端配置	public static class Jedis {
		// Jedis 连接池配置		private final Pool pool = new Pool();	}	// Lettuce 客户端配置	public static class Lettuce {		// Lettuce 连接池配置		private final Pool pool = new Pool();
		private final Cluster cluster = new Cluster();	}}

复制代码

然后在 application.properties 中,我们就可以添加类似如下的配置:

# Redis 单机配置spring.redis.host=127.0.0.1spring.redis.port=31113
# Redis 集群配置# nodes属性是Redis集群节点的地址和端口,用逗号分隔。spring.redis.cluster.nodes=192.168.1.1:7000,192.168.1.2:7001,192.168.1.3:7002# max-redirects属性是最大重定向次数,用于处理节点故障的情况。spring.redis.cluster.max-redirects=3
# mymaster是哨兵模式下的主节点名称。spring.redis.sentinel.master=mymaster# nodes是哨兵模式下的从节点地址和端口。spring.redis.sentinel.nodes=192.168.1.1:26379,192.168.1.2:26379,192.168.1.3:26379
# ...其他配置省略

复制代码

2.3 redisTemplate 方法

先来看看 redisTemplate 方法的源码【Spring Boot 2.7.9】:

@Bean@ConditionalOnMissingBean(name = "redisTemplate")@ConditionalOnSingleCandidate(RedisConnectionFactory.class)public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {	RedisTemplate<Object, Object> template = new RedisTemplate<>();	template.setConnectionFactory(redisConnectionFactory);	return template;}

复制代码

上述逻辑表示只有在当前上下文中不存在名为 "redisTemplate" 的 Bean 时,才会创建一个名为 redisTemplate 的 RedisTemplate Bean,并将其与一个可用的 Redis 连接工厂关联起来。

2.4 stringRedisTemplate 方法

我们再来看看 stringRedisTemplate 方法的源码【Spring Boot 2.7.9】:

@Bean@ConditionalOnMissingBean@ConditionalOnSingleCandidate(RedisConnectionFactory.class)public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {	return new StringRedisTemplate(redisConnectionFactory);}

复制代码

上述逻辑也好理解,它表示只有在当前上下文中不存在名为 "stringRedisTemplate" 的 Bean 时,才会创建一个名为 stringRedisTemplate 的 StringRedisTemplate Bean,并将其与一个可用的 Redis 连接工厂关联起来。

StringRedisTemplate 是 RedisTemplate 的子类,专门用于处理字符串类型的数据。

StringRedisTemplate 使用的是 StringRedisSerializer,它在存入数据时会将数据先序列化成字节数组。

默认情况下,StringRedisTemplate 采用的序列化策略有两种:

  • String 的序列化策略,

  • JDK 的序列化策略。

总结

本篇我们深入分析了 RedisAutoConfiguration 配置类的相关内容,进一步加深了对自动配置装配流程的了解。

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

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

相关文章

速通数据结构与算法第七站 排序

系列文章目录 速通数据结构与算法系列 1 速通数据结构与算法第一站 复杂度 http://t.csdnimg.cn/sxEGF 2 速通数据结构与算法第二站 顺序表 http://t.csdnimg.cn/WVyDb 3 速通数据结构与算法第三站 单链表 http://t.csdnimg.cn/cDpcC 4 速通…

基于springboot+小程序的医院核酸检测服务管理系统(医院2)(源码+sql脚本+视频导入教程+文档)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于springboot小程序的医院核酸检测服务管理系统实现了管理员、用户管理、普通管理员、医护人员。 1、管理员实现了首页、用户管理、医护人员管理、普通管理员、通知公告管理、疫苗接种…

【Postgresql】安装新手教程

在以下postgresql官网下载软件 https://www.enterprisedb.com/downloads/postgres-postgresql-downloads下载完成后安装&#xff0c;找个记事本记录下安装过程中填写的数据库管理原的password和port 在所有程序目录中打开pgadmin 输入刚才的数据库管理员密码 自动跳转到以下…

Redis一些简单通用命令认识常用数据类型和编码方式认识Redis单线程模型

通用命令 get() / set() 这是Redis中两个最为核心的命令。 set插入 这里的key 和 value都是字符串&#xff0c;我们可以加双引号 或者单引号&#xff0c;或者不加。 get查找 如果查询的key值不存在&#xff0c;那么会返回一个 nil &#xff0c;也就是代表空 在Redis中命令…

Hadoop搭建及Springboot集成

文章目录 环境说明下载安装配置单机伪集群配置hadoop-env.sh配置core-sit.xml配置hdfs-site.xml配置 yarn-site.xml配置mapred-site.xml 启动访问web界面 Windows电脑远程调用springBoot 集成 环境说明 使用Hadoop的前提是linux服务器上必须安装java&#xff0c;这里不赘述怎么…

一天学习开发一个APP!PDF转Word文档,Power Platform也能搞定

之前&#xff0c;给大家分享了微软Power Platform开发课程——手把手教你搭建二维码识别器&#xff0c;大家都很感兴趣。听说&#xff0c;很多小伙伴对于PDF转Word文档有困扰&#xff0c;这期我们继续为大家分享Power Platform的开发能力与技巧&#xff0c;怎么通过Power Platf…

[ RK3566-Android11 ] 关于移植 RK628F 驱动以及后HDMI-IN图像延迟/无声等问题

问题描述 由前一篇文章https://blog.csdn.net/jay547063443/article/details/142059700?fromshareblogdetail&sharetypeblogdetail&sharerId142059700&sharereferPC&sharesourcejay547063443&sharefromfrom_link&#xff0c;移植HDMI-IN部分驱动后出现&a…

什么是 JWT?它是如何工作的?

松哥最近辅导了几个小伙伴秋招&#xff0c;有小伙伴在面小红书时遇到这个问题&#xff0c;这个问题想回答全面还是有些挑战&#xff0c;松哥结合之前的一篇旧文和大伙一起来聊聊。 一 无状态登录 1.1 什么是有状态 有状态服务&#xff0c;即服务端需要记录每次会话的客户端信…

什么牌子的护眼台灯质量好?五款护眼台灯性价比高又好用

如今&#xff0c;市场上的护眼台灯琳琅满目&#xff0c;种类繁多。家长们为了孩子们的视力健康&#xff0c;都会精心挑选合适的台灯。什么牌子的护眼台灯质量好&#xff1f;然而&#xff0c;市面上仍存在一些质量不过关的产品&#xff0c;可能会出现频闪、线路短路、底盘过热、…

生产环境升级mysql流程及配置主从服务

之前写到过mysql升级8.4的文章, 因此不再介绍mysql的安装过程 避免服务器安装多个mysql引起冲突的安装方法_安装两个mysql会冲突吗-CSDN博客 生产环境升级mysql8.4.x流程 安装mysql 参考之前文章: 避免服务器安装多个mysql引起冲突的安装方法_安装两个mysql会冲突吗-CSDN博客…

无界购物:线上商城开启便利与智能新潮流-亿发

随着科技的不断进步&#xff0c;线上购物已经成为现代消费者日常生活的重要组成部分。无论是在繁忙的工作间隙&#xff0c;还是在闲暇的周末时光&#xff0c;消费者都能通过线上商城轻松实现购物的愿望。而这一切的背后&#xff0c;是线上商城打破了地理界限&#xff0c;开启了…

【SpringBoot详细教程】-06-Restful风格【持续更新】

点个关注&#xff0c;不迷路 ⾸先&#xff0c;回顾并详细说明⼀下在SSM中使⽤的 Controller 、 RestController 、 RequestMapping 注解。如果您对SpringMVC不熟悉并且还没有尝试过快速⼊⻔案例&#xff0c;建议先看⼀下SSM与Restful相关的内容。 Controller &#xff1a;修饰…

Zynq7000系列中的Quad-SPI(四线制串行外设接口)Flash控制器编程指南

Zynq7000系列中的Quad-SPI&#xff08;四线制串行外设接口&#xff09;Flash控制器是一个功能强大的组件&#xff0c;它支持高速数据传输和多种配置模式。以下是基于Zynq7000系列的Quad-SPI Flash控制器编程指南&#xff0c;旨在帮助开发者了解如何配置和使用该控制器。 编程指…

医院配电系统谐波的分析及治理

七次谐波&#xff0c;流入电网。 4.计算机及UPS 目前大部分医院都是通过计算机实现运营和管理工作&#xff0c;计算机数量众多&#xff0c;计算机服务器配有UPS等备用电源&#xff0c;加之个人电脑的开关电源&#xff0c;都是产生谐波的电源。 3医院配电系统谐波设备的治理方…

【Golang】Go语言中时间time相关处理方法

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

微信广告任务平台 ajax_upload 任意文件上传漏洞

0x01 漏洞描述&#xff1a; 微信广告任务平台ajax_upload接口处存在任意文件上传漏洞&#xff0c;攻击者可利用该漏洞将恶意文件上传至服务器&#xff0c;进而可能实现远程代码执行、篡改网站内容或发动其他形式的攻击&#xff0c;严重危及系统与数据安全。 位于控制器中IndexC…

x-cmd pkg | tokei - 代码统计利器,助你快速了解项目进度

目录 简介首次用户技术特点竞品和相关项目进一步阅读 简介 tokei 是一个使用 Rust 编写的显示有关代码统计信息的命令行工具&#xff0c;可以分门别类的统计目录内的代码行数。 tokei 具有良好的跨平台性&#xff0c;可以在 Linux、macOS、Windows 等多种平台上安装运行。 首…

SU03T(语音识别播报模块)

SU03T&#xff08;语音识别播报模块&#xff09; 注意&#xff1a;学习模块的方法是最重要的 目录 SU03T&#xff08;语音识别播报模块&#xff09; 查找资料 - SU03T 配置固件 1、进入智能公元&#xff0c;并注册登入 2、点击对应的模块&#xff0c;创建产品 3、随便选…

软件测试|数据库常见面试题

在软件测试数据库的面试中&#xff0c;面试官通常会考察应聘者对数据库的理解、SQL语言的应用、数据库性能优化、以及数据库相关的技术栈和工具等方面的知识。以下是一些可能的面试问题及建议的回答思路&#xff1a; 1、什么是关系型数据库&#xff0c;主键&#xff0c;外键&am…

揭秘网络钓鱼:如何识破并防范这场数字时代的诈骗游戏

网络钓鱼是一种网络攻击&#xff0c;它利用伪装的电子邮件欺骗收件人提供信息、下载恶意软件或采取其他期望的行动。 网络钓鱼是网络害虫&#xff0c;自20世纪90年代初从暗网出现以来&#xff0c;至今仍危害全球。根据SlashNext的报告&#xff0c;2023年平均每天有31,000次网络…