Spring Data Redis 是如何在 Jedis 和 Lettuce 之间切换的?

码农StayUp

共 3558字,需浏览 8分钟

 · 2022-02-20

大家好,我是CodingLong!

我们在了解一项新技术时,一般要遵循这样的一个学习过程:这是什么?能做什么?要怎么用?什么原理?

当想要了解这项技术时,首选的还是看官网,因为它的介绍是最准确的。达到一定经验后,还是要了解下它的原理的,我们可以通过看源码的方式。看源码不仅能让我们了解它的实现细节,掌握其原理,更重要还能够学习它的设计思路,及对设计模式的运用。

分析源码是比较枯燥的,不过已经为你探好路了。下面按照这个思路开始今天的主题吧!

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.bootgroupId>
    <artifactId>spring-boot-starter-data-redisartifactId>
dependency>

2.2 自定义配置类

自定义配置类,用于设置Key和Value的序列化。

@Configuration
public class RedisTemplateConfig {

    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate 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 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,用于保证只有一个RedisConnectionFactoryBean被注入。

上图中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 对比

第一种方式的优点是:不会加载多余的依赖包,推荐使用。

第二种方式的优点是:可以通过修改配置文件,自由切换连接方式,有特殊需要时也不失为一种选择。

原理就是这么简单,快去试试吧!

4 推荐阅读

微信搜索:码农StayUp

主页地址:https://gozhuyinglong.github.io

源码分享:https://github.com/gozhuyinglong/blog-demos


浏览 204
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报