首页 > 数据库 >Spring Data Redis切换底层Jedis 和 Lettuce实现

Spring Data Redis切换底层Jedis 和 Lettuce实现

时间:2023-11-27 16:44:05浏览次数:32  
标签:redis Spring 配置 Redis Lettuce Jedis redisTemplate

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:

image-20231127155643648

它引入两个连接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。

image-20231127161706490

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方式。

③ 评估

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

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

本文由博客一文多发平台 OpenWrite 发布!

标签:redis,Spring,配置,Redis,Lettuce,Jedis,redisTemplate
From: https://www.cnblogs.com/JavaEdge/p/17859699.html

相关文章

  • Redis的基本常识
    Redis简介:Redis是完全开源的,遵守BSD协议,是一个高性能的key-value数据库。Redis与其他key-value缓存产品有以下三个特点:Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。Redis不仅仅支持简单的key-value类型的数据,同时还提供l......
  • Spring Security使用拆解
    在前一篇文章《SpringSecurity使用基础》中讲到了使用SpringSecurity的基础知识,下面就对其的使用进行拆解说明1、基本原理SpringSecurity中有几个关键的对象需要我们深入理解,下图是他们间的关系首先,其核心是HttpSecurity,该对象负责对安全控制的所有方面进行配置,例如配置对哪......
  • Spring Boot项目请求日志打印
    SpringBoot项目请求日志打印接口请求日志打印效果如图,基本符合中小型项目所需直接上代码本代码中使用了hutool的工具包,需要先导入依赖<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><vers......
  • Linux编译方式安装redis
    redis安装1、安装gcc-c++编译环境yuninstallgcc-c++2、把redis上传到linux服务器3、解压缩  tar-zxfredis-3.0.0.tar.gz4、make5、安装并指定安装目录 需要创建目录/usr/local/redismakeinstallPREFIX=/usr/local/redis安装完显示结尾为 INSTALLinstall make[1]......
  • redis优化秒杀
    (redis优化秒杀)本文为学习redis时做的笔记,学习内容来自黑马程序员Redis入门到实战教程,该教程是循序渐进的,所以不是一上来就讲完最后的解决方案了,请耐心看完1.异步秒杀思路这是我们原本的秒杀思路,其中的流程都要经过mysql数据库,而mysql数据库的并发性能不是很好,而且为了避免线......
  • 图解Redis适用场景
    Redis以其速度而闻名。1业务数据缓存1.1通用数据缓存string,int,list,map。Redis最常见的用例是缓存对象以加速Web应用程序。此用例中,Redis将频繁请求的数据存储在内存。允许Web服务器快速返回频繁访问的数据。这减轻数据库的负载并提高应用程序RT。规模扩张时,缓存分......
  • 解密Spring Cloud微服务调用:如何轻松获取请求目标方的IP和端口
    公众号「架构成长指南」,专注于生产实践、云原生、分布式系统、大数据技术分享。目的SpringCloud线上微服务实例都是2个起步,如果出问题后,在没有ELK等日志分析平台,如何确定调用到了目标服务的那个实例,以此来排查问题效果可以看到服务有几个实例是上线,并且最终调用了那个实......
  • Spring MVC学习随笔-控制器(Controller)开发详解:接受客户端(Client)请求参数
    学习视频:孙哥说SpringMVC:结合Thymeleaf,重塑你的MVC世界!|前所未有的Web开发探索之旅第三章、SpringMVC控制器开发详解3.1核心要点......
  • 10道不得不会的SpringBoot面试题
    以下是SpringBoot面试题,相信大家都会有种及眼熟又陌生的感觉、看过可能在短暂的面试后又马上忘记了。JavaPub在这里整理这些容易忘记的重点知识及解答,建议收藏,经常温习查阅。来看看你会做几道1.为什么要用springboot?2.springboot有哪些优点?3.springboot核心配置文件是什......
  • 小米二面:Redis 如何保证数据不丢失?
    前段时间表妹收到了小米秋招补录的面试邀请,一面还算顺利,很快就通过了,但在看二面面试录屏的时候,我发现了一个问题,回答的不是很好,也就是我们今天要聊的这个问题:Redis如何保证数据不丢失?很多人看到这个问题的第一反应是,这个问题不难,就是Redis的持久化技术嘛!但如果你这样回答,可能......