关于近期SpringBoot项目中配置Redis过程以及遇到的问题
一:配置pom.xml文件
<!--redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
二:对yml文件进行配置
这里本人在一开始配置时遇到pool的配置无法注入的问题,经查找问题后发现Springboot版本相对应的写法稍有不同,
本人这边用到的是2.6.1版本,版本号在pom文件中可以找到
Springboot 1.*版本
redis:
database: 0
host: 127.0.0.1
port: 6379
password:
pool:
#最大连接数
max-active: 8
#最大阻塞等待时间
max-wait: 6000
#最大空闲连接
max-idle: 8
#最小空闲连接
min-idle: 0
timeout: 5000
SpringBoot 2.*版本
redis:
database: 0
host: 127.0.0.1
port: 6379
password:
jedis:
pool:
#最大连接数
max-active: 8
#最大阻塞等待时间
max-wait: 6000
#最大空闲连接
max-idle: 8
#最小空闲连接
min-idle: 0
timeout: 5000
三:配置类
测试时愚蠢的把配置类给忘配了,一直报错
因为 RedisAutoConfiguration 类中使用了 @ConditionalOnMissingBean(name = “redisTemplate”) 注解,所以我们可以配置自己的 RedisTemplate 类,实现一些定制功能,例如: 返回的 RedisTemplate 的泛型是 <String, Object> 的,可以减少不必要的类型转换操作 设置 Key 和 Value 的序列化方式
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/**
* @author dinghomie
* @date 2019/08/27
*/
@Configuration
public class RedisConfig {
/**
* @SuppressWarnings 该批注的作用是给编译器一条指令,告诉它对被批注的代码元素内部的某些警告保持静默
*
* 关键字 用途
* deprecation 使用了不赞成使用的类或方法时的警告
* unchecked 执行了未检查的转换时的警告,例如当使用集合时没有用泛型 (Generics) 来指定集合保存的类型。
* fallthrough 当 Switch 程序块直接通往下一种情况而没有 Break 时的警告。
* path 在类路径、源文件路径等中有不存在的路径时的警告。
* serial 当在可序列化的类上缺少 serialVersionUID 定义时的警告。
* finally 任何 finally 子句不能正常完成时的警告。
* all 关于以上所有情况的警告。
*/
// 注入 Spring 容器中,忽略所有警告
@Bean
@SuppressWarnings("all")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key 采用 String 的序列化方式
template.setKeySerializer(stringRedisSerializer);
// hash 的 key 也采用 String 的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
// value 的序列化方式采用 JSON
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash value 的序列化方式也采用 JSON
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
四:工具类
在这里遇到的问题是RedisTemplate注入失败
解决方案:
@Autowired
private RedisTemplate<String, Object> redisTemplate;
修改为
@Resource
private RedisTemplate<String, Object> redisTemplate;
完整代码
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.List;
import