广州企业网站推广策划方案,淘宝网页版怎么看直播,免费制作手机网站,网页微信版登录1 简介
Spring Data Redis是 Spring Data 系列的一部分#xff0c;它提供了Spring应用程序对Redis的轻松配置和使用。它不仅提供了对Redis操作的高级抽象#xff0c;还支持Jedis和Lettuce两种连接方式。
可通过简单的配置就能连接Redis#xff0c;并且可以切换Jedis和Lett…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依赖
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactIdversion3.1.0/version
/dependency
2.2 自定义配置类
自定义配置类用于设置Key和Value的序列化。
Configuration
public class RedisTemplateConfig {Beanpublic RedisTemplateObject, Object redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplateObject, 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: localhostport: 6379database: 1
2.4 使用RedisTemplate
注入RedisTemplate后就可操作Redis。
RedisTemplate有两个泛型
K表示Redis中的Key值类型一般 String 类型V表示Redis中的Value值类型V可以是一个对象
SpringBootTest
public class RedisTemplateTest {Resourceprivate RedisTemplateString, String redisTemplate;Testpublic void test_set() {redisTemplate.opsForValue().set(test-key, test-value);}Testpublic 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使用LettuceConnectionConfigurationJedis使用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。
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactIdexclusionsexclusiongroupIdio.lettuce/groupIdartifactIdlettuce-core/artifactId/exclusion/exclusions
/dependency
② 利用ConditionalOnProperty注解
不排除Lettuce的依赖即这两种方式的依赖同时存在。
dependencygroupIdredis.clients/groupIdartifactIdjedis/artifactId
/dependency
通过ConditionalOnProperty注解的校验将配置spring.redis.client-type设为jedis这样也可以切换至Jedis方式。
③ 评估
第一种优点不加载多余的依赖包推荐。
第二种优点可通过修改配置文件自由切换连接方式。 本文由博客一文多发平台 OpenWrite 发布