Spring?Data?Redis切換底層Jedis和Lettuce實(shí)現(xiàn)源碼解析
1 簡(jiǎn)介
Spring Data Redis是 Spring Data 系列的一部分,它提供了Spring應(yīng)用程序?qū)edis的輕松配置和使用。它不僅提供了對(duì)Redis操作的高級(jí)抽象,還支持Jedis和Lettuce兩種連接方式。
可通過(guò)簡(jiǎn)單的配置就能連接Redis,并且可以切換Jedis和Lettuce兩個(gè)連接方式。下面先來(lái)看看我們?cè)撊绾问褂盟?/p>
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 自定義配置類
自定義配置類,用于設(shè)置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提供,如果不改,會(huì)使用默認(rèn)配置。支持單節(jié)點(diǎn)、哨兵模式和集群模式,可自由切換。
spring:
data:
redis:
host: localhost
port: 6379
database: 12.4 使用RedisTemplate
注入RedisTemplate后,就可操作Redis。
RedisTemplate有兩個(gè)泛型:
- K表示Redis中的Key值類型,一般 String 類型
- V表示Redis中的Value值類型,V可以是一個(gè)對(duì)象
@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 源碼分析
從使用來(lái)看,不知道用Jedis or Lettuce或如何切換。
3.1 Redis自動(dòng)配置類:RedisAutoConfiguration
熟悉Spring Boot家族的組件時(shí),一般從它的自動(dòng)配置類開始,Redis自動(dòng)配置類RedisAutoConfiguration:

它引入兩個(gè)連接Redis配置類:
- Lettuce使用LettuceConnectionConfiguration
- Jedis使用JedisConnectionConfiguration
3.2 Lettuce連接配置類:LettuceConnectionConfiguration
條件注解控制當(dāng)前配置類能否生效:
- @ConditionalOnClass:指定一個(gè)或多個(gè)目標(biāo)類,若目標(biāo)類在類路徑下能找到,則當(dāng)前配置類生效;只要有一個(gè)目標(biāo)類未找到,則不生效
- @ConditionalOnProperty:通過(guò)與配置文件的配置項(xiàng),進(jìn)行匹配來(lái)控制是否生效
這兩個(gè)條件注解,只要有一個(gè)不生效,則當(dāng)前配置類不生效。當(dāng)該配置類生效后,會(huì)使用Lettuce相關(guān)依賴,來(lái)生成一個(gè)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類能找到,說(shuō)明已引入Lettuce相關(guān)依賴。spring-boot-starter-data-redis確實(shí)就有l(wèi)ettuce-core依賴,即 Spring Data Redis 默認(rèn)用Lettuce。

3.3 Jedis連接配置類:JedisConnectionConfiguration
同理,會(huì)校驗(yàn)類路徑中是否有Jedis相關(guān)依賴類。
同樣該配置類生效后,會(huì)使用Jedis相關(guān)依賴,來(lái)生成一個(gè)RedisConnectionFactory的Bean,用于獲取Redis連接。
該類中還有一個(gè)注解@ConditionalOnMissingBean,用于保證只有一個(gè)RedisConnectionFactoryBean被注入。

redis.clients.jedis.Jedis類未找到,即無(wú)Jedis相關(guān)依賴包,則當(dāng)前配置類無(wú)效。
3.4 如何將連接方式切換為Jedis
有兩種方式,但前提條件是先引入Jedis相關(guān)依賴。
① 利用@ConditionalOnClass注解
排除Lettuce依賴,只保留Jedis依賴。通過(guò)@ConditionalOnClass注解的校驗(yàn),切換成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的依賴,即這兩種方式的依賴同時(shí)存在。
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>通過(guò)@ConditionalOnProperty注解的校驗(yàn),將配置spring.redis.client-type設(shè)為jedis,這樣也可以切換至Jedis方式。
③ 評(píng)估
第一種優(yōu)點(diǎn):不加載多余的依賴包,推薦。
第二種優(yōu)點(diǎn):可通過(guò)修改配置文件,自由切換連接方式。
以上就是Spring Data Redis切換底層Jedis和Lettuce實(shí)現(xiàn)方法示例的詳細(xì)內(nèi)容,更多關(guān)于Spring Data Redis切換Jedis Lettuce的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java8使用流的filter來(lái)篩選數(shù)據(jù)的實(shí)現(xiàn)
這篇文章主要介紹了java8使用流的filter來(lái)篩選數(shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
Spring Security6配置方法(廢棄WebSecurityConfigurerAdapter)
本文主要介紹了Spring Security6配置方法(廢棄WebSecurityConfigurerAdapter),就像文章標(biāo)題所說(shuō)的,SpringSecurity已經(jīng)廢棄了繼承WebSecurityConfigurerAdapter的配置方式,下面就來(lái)詳細(xì)的介紹一下,感興趣的可以了解一下2023-12-12
springboot配置HikariDataSource連接池的兩種方法
本文介紹了在Spring?Boot中配置HikariDataSource連接池的兩種方式,通過(guò)application.yml或application.properties文件可以設(shè)置數(shù)據(jù)庫(kù)連接信息及Hikari連接池參數(shù),感興趣的可以了解一下2026-01-01
SpringBoot任意版本集成Swagger各種版本的操作指南
在學(xué)習(xí)Swagger生成API文檔的時(shí)候經(jīng)常會(huì)遇到問(wèn)題,而目前市面上大部分技術(shù)分享者的SpringBoot版本并沒(méi)和我們的同步,導(dǎo)致一些一模一樣的代碼,在我們的項(xiàng)目上卻無(wú)法使用,這是一個(gè)經(jīng)常性的問(wèn)題,本文章就旨在和大家搞定SpringBoot任意版本集成Swagger各種版本2024-07-07
Java中實(shí)現(xiàn)日志記錄的方案總結(jié)
在平時(shí)使用到一些軟件中,比如某寶或者某書,通過(guò)記錄用戶的行為來(lái)構(gòu)建和分析用戶的行為數(shù)據(jù),這就需要使用到日志系統(tǒng)來(lái)存儲(chǔ)或者記錄數(shù)據(jù),小編為大家整理了幾種Java日志方案,希望對(duì)大家有所幫助2024-12-12

