Java集成Redis
目录
Redis客户端
项目中想要对接Redis中间件,需要在Java项目中引入Redis的相关依赖。查看Redis官网推荐的客户端程序 Redis Java Client
选择redis相关依赖
Spring Data项目下有 Spring Data Redis 专门针对Redis做了封装,简化了Redis的连接和读写操作。该项目也是使用Jedis和Letture两个客户端,并且在Spring Boot 2.0版本以上默认使用Letture。
Spring Boot项目集成
依赖继承
Spring Boot项目中会添加父依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.10.RELEASE</version>
</parent>
spring-boot-starter-parent 引入了许多Spring家族的项目,并且通过dependencyManagement标签实现子项目按需集成。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.2.10.RELEASE</version>
</dependency>
自已的项目则可以只需要增加redis依赖即可,版本和scope是继承自parent项目。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
增加Redis配置
Redis文档路径就是在Data Properties (可以查看到全量的Redis配置以及默认值)
非Spring boot项目
添加依赖
非Spring Boot项目需要考虑是否之前已经引入了Redis的相关依赖,如果引入了相关依赖,就需要redis包和将要引入的spring-data-starter-data-redis包的版本兼容性。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
相比,就是多设置了version属性。
非Spring项目初始化
// 1. 初始化连接池配置
GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
//这个参数默认是-1,在极端情况下会导致连接池资源耗尽
genericObjectPoolConfig.setMaxWaitMillis(1000);
// 2.初始化redisCluster
RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration();
// 读取自己的配置
redisClusterConfiguration.clusterNode();
redisClusterConfiguration.setPassword();
redisClusterConfiguration.setMaxRedirects(5);
// 3.初始化LettuceConnectionFactory
LettuceConnectionFactory factory = new LettuceConnectionFactory(redisClusterConfiguration, clientConfig);
factory.afterPropertiesSet();
// 4.初始化RedisTemplate
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,
ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
jackson2JsonRedisSerializer.setObjectMapper(mapper);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
//key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
// hash的key也采用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
// value序列化方式采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash的value序列化方式采用jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
// 5. 使用RedisTemplate封装一个RedisUtils工具类,这里就不详细写了,可以参考其他博客
Spring Boot 如何初始化Redis
Spring Boot核心是autoconfigure自动配置,主要就是读取META-INF/spring.factories来加载配置类,其中就有Redis的配置类RedisAutoConfiguration
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
public class RedisAutoConfiguration {
@Bean
@ConditionalOnMissingBean(name = "redisTemplate")
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
@Bean
@ConditionalOnMissingBean
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
redis初始化的流程简洁版可以看下图:
这里我就解释一个点:@Bean这个注解,会自动注入对象,上图中就是注入了RedisConnectionFactory,从而完成流程闭环。