详解Spring Boot的RedisAutoConfiguration配置

一给  金牌会员 | 2024-6-14 15:22:38 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 857|帖子 857|积分 2571

本文分享自华为云社区《【Spring Boot 源码学习】RedisAutoConfiguration 详解》,作者: Huazie。
弁言

带大家分析 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。
  • 支持 JDK、String、JSON和 Spring 对象 / XML 映射序列化器。
  • 在 Redis 上实现 JDK 聚集。
  • 支持原子计数器类。
  • 支持排序和管道功能。
  • 专用于 SORT、SORT/GET模式和支持返回批量值的功能。
  • 为 Spring 缓存抽象提供 Redis 实现。
  • 主动实现 Repository 接口,包括使用 @EnableRedisRepositories 支持自界说查询方法。
  • 对存储库提供 CDI 支持。
在 Spring Data Redis 中,我们可以直接使用 RedisTemplate 及其相关的类来操纵 Redis。固然 RedisConnection 提供了担当和返回二进制值(字节数组)的低级方法,但 RedisTemplate 负责序列化和连接管理,使用户可以无需处理这些细节。
RedisTemplate 还提供了操纵视图(按照 Redis 命令参考进行分组),这些视图提供了丰富、通用的接口,用于针对特定类型或特定键进行操纵(通过 KeyBound 接口实现),如下表所示:
下面我们来看看相关的 Spring 配置:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.   xmlns:p="http://www.springframework.org/schema/p"
  5.   xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
  6.   <bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/>
  7.   
  8.   <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnFactory"/>
  9. </beans>
复制代码
一旦配置完成,Redis 模板就是线程安全的,并且可以在多个实例之间重用。
RedisTemplate 使用基于 Java 的序列化器进行大部门操纵。也就意味着通过模板写入或读取的任何对象都是通过 Java 进行序列化和反序列化的。
我们也可以更改模板上的序列化机制,可以添加如下配置:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.   xmlns:p="http://www.springframework.org/schema/p"
  5.   xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
  6.   <bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/>
  7.   
  8.   <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnFactory"/>
  9. </beans><?xml version="1.0" encoding="UTF-8"?>
  10. <beans xmlns="http://www.springframework.org/schema/beans"
  11.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  12.   xmlns:p="http://www.springframework.org/schema/p"
  13.   xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
  14.   <bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/>
  15.   
  16.   <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnFactory"/>
  17. </beans><?xml version="1.0" encoding="UTF-8"?>
  18. <beans xmlns="http://www.springframework.org/schema/beans"
  19.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  20.   xmlns:p="http://www.springframework.org/schema/p"
  21.   xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
  22.   <bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/>
  23.   
  24.   <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnFactory"/>
  25. </beans><?xml version="1.0" encoding="UTF-8"?>
  26. <beans xmlns="http://www.springframework.org/schema/beans"
  27.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  28.   xmlns:p="http://www.springframework.org/schema/p"
  29.   xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
  30.   <bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/>
  31.   
  32.   <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnFactory"/>
  33. </beans><?xml version="1.0" encoding="UTF-8"?>
  34. <beans xmlns="http://www.springframework.org/schema/beans"
  35.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  36.   xmlns:p="http://www.springframework.org/schema/p"
  37.   xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
  38.   <bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/>
  39.   
  40.   <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnFactory"/>
  41. </beans><?xml version="1.0" encoding="UTF-8"?>
  42. <beans xmlns="http://www.springframework.org/schema/beans"
  43.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  44.   xmlns:p="http://www.springframework.org/schema/p"
  45.   xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
  46.   <bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/>
  47.   
  48.   <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnFactory"/>
  49. </beans><?xml version="1.0" encoding="UTF-8"?>
  50. <beans xmlns="http://www.springframework.org/schema/beans"
  51.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  52.   xmlns:p="http://www.springframework.org/schema/p"
  53.   xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
  54.   <bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/>
  55.   
  56.   <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnFactory"/>
  57. </beans><?xml version="1.0" encoding="UTF-8"?>
  58. <beans xmlns="http://www.springframework.org/schema/beans"
  59.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  60.   xmlns:p="http://www.springframework.org/schema/p"
  61.   xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
  62.   <bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/>
  63.   
  64.   <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnFactory"/>
  65. </beans><?xml version="1.0" encoding="UTF-8"?>
  66. <beans xmlns="http://www.springframework.org/schema/beans"
  67.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  68.   xmlns:p="http://www.springframework.org/schema/p"
  69.   xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
  70.   <bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/>
  71.   
  72.   <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnFactory"/>
  73. </beans><?xml version="1.0" encoding="UTF-8"?>
  74. <beans xmlns="http://www.springframework.org/schema/beans"
  75.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  76.   xmlns:p="http://www.springframework.org/schema/p"
  77.   xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
  78.   <bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/>
  79.   
  80.   <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnFactory"/>
  81. </beans><?xml version="1.0" encoding="UTF-8"?>
  82. <beans xmlns="http://www.springframework.org/schema/beans"
  83.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  84.   xmlns:p="http://www.springframework.org/schema/p"
  85.   xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
  86.   <bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/>
  87.   
  88.   <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnFactory"/>
  89. </beans>  
复制代码
而 Redis 模块提供了几个序列化器的实现,有关这些实现大家可以查看 org.springframework.data.redis.serializer 包。

还可以将任何序列化步伐设置为 null,并通过设置 enableDefaultSerializer 属性为 false 来使用RedisTemplate 与原始字节数组一起使用。
注意: 模板要求所有键都不为空。但是,只要底层序列化步伐担当值,值就可以为空。
下面我们可以注入 RedisTemplate,并调用 RedisTemplate 的方法进行存储、查询、删除等操纵。
  1. @Autowired
  2. private RedisTemplate<String, Object> redisTemplate;
  3. // 存储数据
  4. redisTemplate.opsForValue().set("key", "value");
  5. // 查询数据
  6. Object value = redisTemplate.opsForValue().get("key");
  7. // 删除数据
  8. redisTemplate.delete("key");
复制代码
对于需要特定模板视图的环境,声明视图作为依赖项并注入模板。容器会主动执行转换,消除opsFor[X] 调用,如下所示的示例:
  1. public class Example {<?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.   xmlns:p="http://www.springframework.org/schema/p"
  5.   xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
  6.   <bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/>
  7.   
  8.   <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnFactory"/>
  9. </beans>  // inject the template as ListOperations    @Resource(name="redisTemplate")    private ListOperations listOps;<?xml version="1.0" encoding="UTF-8"?>
  10. <beans xmlns="http://www.springframework.org/schema/beans"
  11.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  12.   xmlns:p="http://www.springframework.org/schema/p"
  13.   xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
  14.   <bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/>
  15.   
  16.   <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnFactory"/>
  17. </beans>  public void addLink(String userId, URL url) {<?xml version="1.0" encoding="UTF-8"?>
  18. <beans xmlns="http://www.springframework.org/schema/beans"
  19.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  20.   xmlns:p="http://www.springframework.org/schema/p"
  21.   xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
  22.   <bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/>
  23.   
  24.   <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnFactory"/>
  25. </beans>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 文件中:
  1. org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration=
  2. org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration.ConditionalOnClass=org.springframework.data.redis.core.RedisOperations
复制代码
显然这里涉及到了 ConditionalOnClass 注解,我们翻看 RedisAutoConfiguration 配置类的源码,如下:
  1. @AutoConfiguration@ConditionalOnClass(RedisOperations.class)@EnableConfigurationProperties(RedisProperties.class)@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })public class RedisAutoConfiguration {    @Bean    @ConditionalOnMissingBean(name = "redisTemplate")    @ConditionalOnSingleCandidate(RedisConnectionFactory.class)    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {<?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.   xmlns:p="http://www.springframework.org/schema/p"
  5.   xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
  6.   <bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/>
  7.   
  8.   <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnFactory"/>
  9. </beans>  // 。。。    }    @Bean    @ConditionalOnMissingBean    @ConditionalOnSingleCandidate(RedisConnectionFactory.class)    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {<?xml version="1.0" encoding="UTF-8"?>
  10. <beans xmlns="http://www.springframework.org/schema/beans"
  11.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  12.   xmlns:p="http://www.springframework.org/schema/p"
  13.   xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
  14.   <bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/>
  15.   
  16.   <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnFactory"/>
  17. </beans>  // 。。。    }}
复制代码
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 管理的 Bean。Spring 容器会主动管理这个 Bean 的生命周期,包括依赖注入、初始化和销毁等。
  • @ConditionalOnMissingBean :只有在当前 Spring 容器中不存在指定类型的 Bean 时,才会执行被注解的方法。这样可以用于确保在需要的时候才创建某个 Bean,避免重复创建。
  • @ConditionalOnSingleCandidate:只有在当前上下文中存在且只有一个指定类型的 bean 候选者时,才会创建这个 bean。
2.2.2 RedisProperties
此中 RedisProperties 类的属性值对应着 application.yml 或 application.properties 中的配置,通过注解@ConfigurationProperties(prefix = "spring.redis") 实现的属性注入。
有关属性注入的内容后续笔者会另外介绍,我们先来看看RedisProperties 类相关的部门源码 和 对应的配置参数:
  1. @ConfigurationProperties(prefix = "spring.redis")public class RedisProperties {    // 。。。    // Redis 服务器主机地址.    private String host = "localhost";<?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.   xmlns:p="http://www.springframework.org/schema/p"
  5.   xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
  6.   <bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/>
  7.   
  8.   <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnFactory"/>
  9. </beans>  // 。。。    // 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 {<?xml version="1.0" encoding="UTF-8"?>
  10. <beans xmlns="http://www.springframework.org/schema/beans"
  11.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  12.   xmlns:p="http://www.springframework.org/schema/p"
  13.   xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
  14.   <bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/>
  15.   
  16.   <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnFactory"/>
  17. </beans>  // 。。。    }    // Redis 集群配置    public static class Cluster {<?xml version="1.0" encoding="UTF-8"?>
  18. <beans xmlns="http://www.springframework.org/schema/beans"
  19.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  20.   xmlns:p="http://www.springframework.org/schema/p"
  21.   xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
  22.   <bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/>
  23.   
  24.   <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnFactory"/>
  25. </beans>  // 。。。    }    // Redis 哨兵配置    public static class Sentinel {<?xml version="1.0" encoding="UTF-8"?>
  26. <beans xmlns="http://www.springframework.org/schema/beans"
  27.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  28.   xmlns:p="http://www.springframework.org/schema/p"
  29.   xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
  30.   <bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/>
  31.   
  32.   <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnFactory"/>
  33. </beans>  // 。。。    }    // Jedis 客户端配置    public static class Jedis {<?xml version="1.0" encoding="UTF-8"?>
  34. <beans xmlns="http://www.springframework.org/schema/beans"
  35.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  36.   xmlns:p="http://www.springframework.org/schema/p"
  37.   xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
  38.   <bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/>
  39.   
  40.   <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnFactory"/>
  41. </beans>  // Jedis 连接池配置<?xml version="1.0" encoding="UTF-8"?>
  42. <beans xmlns="http://www.springframework.org/schema/beans"
  43.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  44.   xmlns:p="http://www.springframework.org/schema/p"
  45.   xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
  46.   <bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/>
  47.   
  48.   <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnFactory"/>
  49. </beans>  private final Pool pool = new Pool();    }    // Lettuce 客户端配置    public static class Lettuce {<?xml version="1.0" encoding="UTF-8"?>
  50. <beans xmlns="http://www.springframework.org/schema/beans"
  51.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  52.   xmlns:p="http://www.springframework.org/schema/p"
  53.   xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
  54.   <bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/>
  55.   
  56.   <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnFactory"/>
  57. </beans>  // Lettuce 连接池配置<?xml version="1.0" encoding="UTF-8"?>
  58. <beans xmlns="http://www.springframework.org/schema/beans"
  59.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  60.   xmlns:p="http://www.springframework.org/schema/p"
  61.   xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
  62.   <bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/>
  63.   
  64.   <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnFactory"/>
  65. </beans>  private final Pool pool = new Pool();<?xml version="1.0" encoding="UTF-8"?>
  66. <beans xmlns="http://www.springframework.org/schema/beans"
  67.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  68.   xmlns:p="http://www.springframework.org/schema/p"
  69.   xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
  70.   <bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/>
  71.   
  72.   <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnFactory"/>
  73. </beans>  private final Cluster cluster = new Cluster();    }}
复制代码
然后在 application.properties 中,我们就可以添加类似如下的配置:
  1. # Redis 单机配置
  2. spring.redis.host=127.0.0.1
  3. spring.redis.port=31113
  4. # Redis 集群配置
  5. # nodes属性是Redis集群节点的地址和端口,用逗号分隔。
  6. spring.redis.cluster.nodes=192.168.1.1:7000,192.168.1.2:7001,192.168.1.3:7002
  7. # max-redirects属性是最大重定向次数,用于处理节点故障的情况。
  8. spring.redis.cluster.max-redirects=3
  9. # mymaster是哨兵模式下的主节点名称。
  10. spring.redis.sentinel.master=mymaster
  11. # nodes是哨兵模式下的从节点地址和端口。
  12. spring.redis.sentinel.nodes=192.168.1.1:26379,192.168.1.2:26379,192.168.1.3:26379
  13. # ...其他配置省略
复制代码
2.3 redisTemplate 方法

先来看看 redisTemplate 方法的源码【Spring Boot 2.7.9】:
  1. @Bean
  2. @ConditionalOnMissingBean(name = "redisTemplate")
  3. @ConditionalOnSingleCandidate(RedisConnectionFactory.class)
  4. public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
  5.     RedisTemplate<Object, Object> template = new RedisTemplate<>();
  6.     template.setConnectionFactory(redisConnectionFactory);
  7.     return template;
  8. }
复制代码
上述逻辑表示只有在当前上下文中不存在名为 "redisTemplate" 的 Bean 时,才会创建一个名为 redisTemplate 的 RedisTemplate Bean,并将其与一个可用的 Redis 连接工厂关联起来。
2.4 stringRedisTemplate 方法

我们再来看看 stringRedisTemplate 方法的源码【Spring Boot 2.7.9】:
  1. @Bean
  2. @ConditionalOnMissingBean
  3. @ConditionalOnSingleCandidate(RedisConnectionFactory.class)
  4. public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
  5.     return new StringRedisTemplate(redisConnectionFactory);
  6. }
复制代码
上述逻辑也好理解,它表示只有在当前上下文中不存在名为 "stringRedisTemplate" 的 Bean 时,才会创建一个名为stringRedisTemplate的 StringRedisTemplate Bean,并将其与一个可用的 Redis 连接工厂关联起来。
StringRedisTemplate 是 RedisTemplate 的子类,专门用于处理字符串类型的数据。
StringRedisTemplate 使用的是 StringRedisSerializer,它在存入数据时会将数据先序列化成字节数组。
默认环境下,StringRedisTemplate 接纳的序列化计谋有两种:

  • String 的序列化计谋,
  • JDK 的序列化计谋。
总结

本篇我们深入分析了 RedisAutoConfiguration 配置类的相关内容,进一步加深了对主动配置装配流程的了解。
 
点击关注,第一时间了解华为云新鲜技术~
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

一给

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表