Spring Data Redis 是如何在 Jedis 和 Lettuce 之间切换的?
我们在了解一项新技术时,一般要遵循这样的一个学习过程:这是什么?能做什么?要怎么用?什么原理?
当想要了解这项技术时,首选的还是看官网,因为它的介绍是最准确的。达到一定经验后,还是要了解下它的原理的,我们可以通过看源码的方式。看源码不仅能让我们了解它的实现细节,掌握其原理,更重要还能够学习它的设计思路,及对设计模式的运用。
分析源码是比较枯燥的,不过已经为你探好路了。下面按照这个思路开始今天的主题吧!
1 介绍
Spring Data Redis是 Spring Data 系列的一部分,它提供了Spring应用程序对Redis的轻松配置和使用。它不仅提供了对Redis操作的高级抽象,还支持Jedis和Lettuce两种连接方式。
我们可以通过简单的配置就能连接Redis,并且可以切换Jedis和Lettuce两个连接方式。下面先来看看我们该如何使用它。
2 使用
2.1 引入Redis依赖
使用Spring Boot 提供的spring-boot-starter-data-redis
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.2 自定义配置类
自定义配置类,用于设置Key和Value的序列化。
@Configuration
public class RedisTemplateConfig {
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
return redisTemplate;
}
}
2.3 修改Redis连接配置
配置由Spring Boot提供,如果不改,会使用默认配置。并且该配置支持单节点、哨兵模式和集群模式,可以自由切换,这里就不多介绍了,网上一大堆。
spring:
redis:
host: 127.0.0.1
database: 0
port: 6379
2.4 使用RedisTemplate
注入RedisTemplate后,就可以操作Redis了。
RedisTemplate有两个泛型,其中K
表示Redis中的Key值类型,一般是 String 类型;而V
表示Redis中的Value值类型,并且V
可以是一个对象。
@SpringBootTest
public class RedisTemplateTest {
@Resource
private RedisTemplate<String, String> redisTemplate;
@Test
public void test_set() {
redisTemplate.opsForValue().set("test-key", "test-value");
}
@Test
public void test_get() {
String value = redisTemplate.opsForValue().get("test-key");
System.out.println(value);
}
}
3 源码分析
从上面的使用来看,我们并不知道它用的是Jedis还是Lettuce。下面就通过源码来看看使用的哪种连接方式,并且该如何切换。
3.1 Redis自动配置类:RedisAutoConfiguration
在上一篇《Spring Boot 自动配置的原理》中已经讲过自动配置的原理了,不了解的老铁建议先看下。
我们在了解Spring Boot系列的组件时,一般是从它的自动配置类开始,Redis的自动配置类是RedisAutoConfiguration
。它引入了两个连接Redis配置类:Lettuce使用LettuceConnectionConfiguration
,Jedis使用JedisConnectionConfiguration
。
3.2 Lettuce连接配置类:LettuceConnectionConfiguration
这里有两个条件注解,用于控制当前配置类能否生效:
@ConditionalOnClass
:指定一个或多个目标类,若目标类在类路径下能够找到,则当前配置类生效;而只要有一个目标类未找到,则不生效。@ConditionalOnProperty
:通过与配置文件的配置项,进行匹配来控制是否生效。
这两个条件注解,只要有一个不生效,则当前配置类不生效。当该配置类生效后,会使用Lettuce相关依赖,来生成一个RedisConnectionFactory
的Bean,用于获取Redis连接。
上图中io.lettuce.core.RedisClient
类能够找到,说明已经引入Lettuce相关依赖。在spring-boot-starter-data-redis
中果然找到了lettuce-core
依赖,那也就是说,Spring Data Redis 默认使用的是Lettuce。
3.3 Jedis连接配置类:JedisConnectionConfiguration
Jedis的配置类与Lettuce的配置类原理相同,同样会校验类路径中是否有Jedis相关依赖类。
同样该配置类生效后,会使用Jedis相关依赖,来生成一个RedisConnectionFactory
的Bean,用于获取Redis连接。
该类中还有一个注解@ConditionalOnMissingBean
,用于保证只有一个RedisConnectionFactory
Bean被注入。
上图中redis.clients.jedis.Jedis
类未找到,即没有Jedis相关依赖包,那么当前配置类无效。
3.4 如何将连接方式切换为Jedis
Spring Data Redis 默认使用的是Lettuce,那么如何将连接方式切换为Jedis呢?其实有两种方式,但前提条件是要先引入Jedis相关依赖。
3.4.1 第一种方式:利用@ConditionalOnClass注解
排除Lettuce依赖,只保留Jedis依赖。这样通过@ConditionalOnClass
注解的校验,切换成了Jedis方式。
3.4.2 第二种方式:利用@ConditionalOnProperty注解
不排除Lettuce的依赖,也就是说这两种方式的依赖同时存在。
我们通过@ConditionalOnProperty
注解的校验,将配置spring.redis.client-type
设为jedis
,这样也可以切换至Jedis方式。
3.4.3 对比
第一种方式的优点是:不会加载多余的依赖包,推荐使用。
第二种方式的优点是:可以通过修改配置文件,自由切换连接方式,有特殊需要时也不失为一种选择。
原理就是这么简单,快去试试吧!
- 点赞
- 收藏
- 关注作者
评论(0)