Spring Data Redis切换底层Jedis和Lettuce实现源码解析

 更新时间:2023年11月29日 10:29:54   作者:JavaEdge  
这篇文章主要为大家介绍了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>
  <version>3.1.0</version>
</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:
  data:
    redis:
      host: localhost
      port: 6379
      database: 1

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 or Lettuce或如何切换。

3.1 Redis自动配置类:RedisAutoConfiguration

熟悉Spring Boot家族的组件时,一般从它的自动配置类开始,Redis自动配置类RedisAutoConfiguration:

它引入两个连接Redis配置类:

  • Lettuce使用LettuceConnectionConfiguration
  • Jedis使用JedisConnectionConfiguration

3.2 Lettuce连接配置类:LettuceConnectionConfiguration

条件注解控制当前配置类能否生效:

  • @ConditionalOnClass:指定一个或多个目标类,若目标类在类路径下能找到,则当前配置类生效;只要有一个目标类未找到,则不生效
  • @ConditionalOnProperty:通过与配置文件的配置项,进行匹配来控制是否生效

这两个条件注解,只要有一个不生效,则当前配置类不生效。当该配置类生效后,会使用Lettuce相关依赖,来生成一个RedisConnectionFactory的Bean,用于获取Redis连接。

package org.springframework.boot.autoconfigure.data.redis;

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(RedisClient.class)
@ConditionalOnProperty(name = "spring.data.redis.client-type", havingValue = "lettuce", matchIfMissing = true)
class LettuceConnectionConfiguration extends RedisConnectionConfiguration {
  ...
}

io.lettuce.core.RedisClient类能找到,说明已引入Lettuce相关依赖。spring-boot-starter-data-redis确实就有lettuce-core依赖,即 Spring Data Redis 默认用Lettuce。

3.3 Jedis连接配置类:JedisConnectionConfiguration

同理,会校验类路径中是否有Jedis相关依赖类。

同样该配置类生效后,会使用Jedis相关依赖,来生成一个RedisConnectionFactory的Bean,用于获取Redis连接。

该类中还有一个注解@ConditionalOnMissingBean,用于保证只有一个RedisConnectionFactoryBean被注入。

redis.clients.jedis.Jedis类未找到,即无Jedis相关依赖包,则当前配置类无效。

3.4 如何将连接方式切换为Jedis

有两种方式,但前提条件是先引入Jedis相关依赖。

① 利用@ConditionalOnClass注解

排除Lettuce依赖,只保留Jedis依赖。通过@ConditionalOnClass注解的校验,切换成Jedis。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <exclusions>
        <exclusion>
            <groupId>io.lettuce</groupId>
            <artifactId>lettuce-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>

② 利用@ConditionalOnProperty注解

不排除Lettuce的依赖,即这两种方式的依赖同时存在。

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>

通过@ConditionalOnProperty注解的校验,将配置spring.redis.client-type设为jedis,这样也可以切换至Jedis方式。

③ 评估

第一种优点:不加载多余的依赖包,推荐。

第二种优点:可通过修改配置文件,自由切换连接方式。

以上就是Spring Data Redis切换底层Jedis和Lettuce实现方法示例的详细内容,更多关于Spring Data Redis切换Jedis Lettuce的资料请关注脚本之家其它相关文章!

相关文章

  • Java与C++分别用递归实现汉诺塔详解

    Java与C++分别用递归实现汉诺塔详解

    汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。本文将用Java与C++分别实现,感兴趣的可以学习一下
    2022-05-05
  • Java将文件分割为多个子文件再将子文件合并成原始文件的示例

    Java将文件分割为多个子文件再将子文件合并成原始文件的示例

    本篇文章主要介绍了Java将文件分割为多个子文件再将子文件合并成原始文件的示例,具有一定的参考价值,有兴趣的可以了解一下。
    2017-02-02
  • idea如何指定MainClass

    idea如何指定MainClass

    文章介绍了如何在IntelliJ IDEA中设置Java后台测试程序的MainClass,并分享了设置JDK版本和Project language level的方法
    2024-11-11
  • Springboot+Netty+Websocket实现消息推送实例

    Springboot+Netty+Websocket实现消息推送实例

    这篇文章主要介绍了Springboot+Netty+Websocket实现消息推送实例,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • java反射原理制作对象打印工具

    java反射原理制作对象打印工具

    本文主要给大家介绍了java反射原理制作对象打印工具的方法和代码,以及一个热心网友给出的更加简洁方便的代码,小伙伴们需要的话可以参考下。
    2015-12-12
  • Spring web集成rabbitmq代码实例

    Spring web集成rabbitmq代码实例

    这篇文章主要介绍了Spring web集成rabbitmq代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • Mybatis关联查询之一对多和多对一XML配置详解

    Mybatis关联查询之一对多和多对一XML配置详解

    这篇文章主要介绍了Mybatis关联查询之一对多和多对一XML配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Spring Boot 中使用 JSON Schema 校验复杂JSON数据的过程

    Spring Boot 中使用 JSON Schema 校验复杂JSO

    在数据交换领域,JSON Schema 以其强大的标准化能力,为定义和规范 JSON 数据的结构与规则提供了有力支持,下面给大家介绍Spring Boot 中使用 JSON Schema 校验复杂JSON数据的过程,感兴趣的朋友跟随小编一起看看吧
    2024-08-08
  • Java数据结构之简单链表的定义与实现方法示例

    Java数据结构之简单链表的定义与实现方法示例

    这篇文章主要介绍了Java数据结构之简单链表的定义与实现方法,简单描述了链接的概念、原理,并结合实例形式分析了java定义与使用链表的相关步骤与操作技巧,需要的朋友可以参考下
    2017-10-10
  • Jenkins之Log Parse使用方法详解

    Jenkins之Log Parse使用方法详解

    这篇文章主要为大家详细介绍了Jenkins插件Log Parse使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08

最新评论