详解 Spring Boot 的 RedisAutoConfiguration 配置

引言

带大家分析 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.xdnf.cn/news/1547288.html

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

相关文章

超60%项目聚焦智能体,百度“文心杯”创业大赛卷起来了

“通过AI Native工具AI Native工作流AI Native创作者协同&#xff0c;我们将传统A级漫画的创作成本降低了62%。”水母智能创始人兼CEO苗奘表示&#xff0c;“4月份决定报名参加‘文心杯’创业大赛&#xff0c;除了百度提供的奖金和资源外&#xff0c;更吸引我的是Robin的理念&a…

Synchronized对字符串上锁?

HTTP去请求就会像上面那种自动加个new String&#xff08;&#xff09;&#xff0c;就会导致锁的线程不是同一个对象&#xff0c;可以通过获取对应常量达到效果 但还有个问题&#xff0c;字符串常量是存在JVM的常量池中。常量池是全局的。所以在其他地方有引用到相关常量时&…

OCI 简介:Kubernetes 环境下从代码到容器的全流程

OCI 简介 在容器化技术的演进中&#xff0c;OCI&#xff08;Open Container Initiative&#xff09;提供了一套标准化的规范&#xff0c;帮助统一容器的构建、分发和运行。OCI 规范包含三个部分&#xff1a; OCI Image-spec&#xff1a;定义了容器镜像的结构&#xff0c;确保…

WAF,全称Web Application Firewall,好用WAF推荐

WAF&#xff0c;全称Web Application Firewall&#xff0c;即Web应用防火墙&#xff0c;是一种网络安全设备&#xff0c;旨在保护Web应用程序免受各种Web攻击&#xff0c;如SQL注入、跨站脚本&#xff08;XSS&#xff09;、跨站请求伪造&#xff08;CSRF&#xff09;等。 WAF通…

STM32堆栈溢出Bug

可以看到x和buf交换位置后&#xff0c;x处于0x200006B0地址上是不会被函数B影响到的&#xff0c;实际上B函数对buf赋值的过程是出现了越界行为的&#xff0c;所以导致了x在buf地址之后的话会被意外修改掉值。

海外媒体投稿:如何运用3种国内外媒体套餐发稿突出重围?

在当今瞬息万变的经营环境中&#xff0c;突出重围营销推广是每家企业都需要思考的问题。为了能突出重围并提升影响力&#xff0c;国内外媒体套餐内容成为了一个非常受欢迎的挑选。下面我们就为大家讲解如何运用三种不同种类的国内外媒体套餐内容来推广突出重围。 2.微博营销新浪…

Nacos笔记

nacos注册中心&#xff1a; nacos注册中心得单击非持久化搭建&#xff1a; 单机&#xff1a;指的是 Nacos 运行在单个实例上&#xff0c;通常用于开发和测试环境。非持久化&#xff1a;表示注册的信息&#xff08;如服务实例、元数据等&#xff09;不会被保存在数据库中。Nac…

Python 从入门到实战29(目录的操作)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们讨论了文件的打开、创建、关闭、读取的相关知识。今天…

智慧政务助力实现服务民生新突破

在数字化转型的浪潮中&#xff0c;中国移动紧密结合人工智能&#xff08;AI&#xff09;技术&#xff0c;推动政务服务的智能化升级。近日&#xff0c;中国移动正式发布政务大模型3.0版本&#xff0c;以科技创新提升政务效率&#xff0c;实现服务民生的新突破。 为什么…

从0到1训练私有大模型技能与应用实现

1.背景 近期&#xff0c;GPT大模型的发布给自然语言处理&#xff08;NLP&#xff09;领域带来了令人震撼的体验。随着这一事件的发生&#xff0c;一系列开源大模型也迅速崛起。依据一些评估机构的评估&#xff0c;这些开源模型大模型的表现也相当不错。一些大模型的评测情况可…

关于Pencils Protocol 近期市场活动,通读这篇就够!

Pencils Protocol是Scroll上综合性的DeFi协议&#xff0c;自9月18日开始其陆续在Tokensoft、Bounce、Coresky等平台开启DAPP通证的销售&#xff0c;并分别在短期内完成售罄。吸引了来自韩国、CIS、土耳其等70多个国家的5万多名认证用户&#xff0c;反响热烈&#xff0c; Pencil…

VMware搭建DVWA靶场

目录 1.安装phpstudy 2.搭建DVWA 本次搭建基于VMware16的win7系统 1.安装phpstudy 下载windows版本&#xff1a;小皮面板-好用、安全、稳定的Linux服务器面板&#xff01; 安装后先开启mysql再开启apache&#xff0c;遇到mysql启动不了的情况&#xff0c;最后重装了phpstud…

一窥AI大模型奥秘:技术前沿与产业应用双轮驱动

在科技日新月异的今天&#xff0c;人工智能&#xff08;AI&#xff09;正以前所未有的速度重塑着我们的生活与工作方式。其中&#xff0c;AI大模型作为技术的最前沿&#xff0c;不仅引领着技术体系的革新&#xff0c;更是产业实践与未来趋势的关键所在。 近期&#xff0c;有幸…

YOLOv8+注意力机制+PyQt5玉米病害检测系统完整资源集合

资源包含可视化的玉米病害检测系统&#xff0c;基于最新的YOLOv8注意力机制训练的玉米病害检测模型&#xff0c;和基于PyQt5制作的可视玉米病害系统&#xff0c;包含登陆页面和检测页面&#xff0c;该系统可自动检测和识别图片或视频当中出现的七类玉米病害&#xff1a;矮花叶病…

Linux防火墙-什么是防火墙

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 什么是防火墙 我们想象一下把每台服务器当成一个小区&#xff0c;我们去访问另外一个小区的朋友&#xff0c;我们需要经过什…

黑马头条day4 自媒体文章自动审核

阿里云内容安全调用 其实这个接口调用不是很难 但是需要花钱 就没买 我开了按量计费 但是还是不行 所以就没测试 于是尝试自己写返回成功值 效果不好 后来发现不如直接在函数里边取消调用文字和图片审核 这样更简单 远程调用与降级处理 这里有个bug调试了好久 第一个就是总…

Cannon-es.js物理引擎中物体动力控制的深度探索

本文目录 前言1、cannon-es给物体施加力1.1 前置代码1.2 效果1.3 给小球施加力1. applyForce效果 2. applyImpulse效果 3. applyLocalImpulse效果 4. applyTorque效果 区别总结 前言 在三维物理引擎的世界里&#xff0c;Cannon-ES以其轻量级和高效能著称&#xff0c;为开发者提…

使用docker形式部署prometheus+alertmanager+钉钉告警

一、拉取所需要的镜像 docker pull prom/node-exporter docker pull grafana/grafana docker pull prom/prometheus docker pull prom/alertmanager 其中 prom/node-exporter&#xff1a;用于收集主机系统信息和指标的 grafana/grafana&#xff1a;是一个用于可视化和分…

NRF21540—低功耗蓝牙,蓝牙mesh、Thread和Zigbee和2.4 GHz私有协议范围扩展射频前端模块

nRF21540是一款射频前端模块(FEM)&#xff0c;可用于改善短距离无线产品的传输范围和连接鲁棒性。作为一款辅助性设备&#xff0c;nRF21540是一种“即插即用型”的无线传输范围扩展器&#xff0c;可与nRF52和nRF53系列的高级多协议无线SoC搭配使用&#xff0c;所需的外部器件数…

11. Map和Set

一、二叉搜索树 1. 概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树&#xff1a; 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根…