IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring Data Redis 是如何在 Jedis 和 Lettuce 之间切换的? -> 正文阅读

[Java知识库]Spring Data Redis 是如何在 Jedis 和 Lettuce 之间切换的?

大家好,我是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.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,用于保证只有一个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

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-02-22 20:26:07  更:2022-02-22 20:27:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:44:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码