整合Redis以及Redis的序列化
最近做一个项目,考虑到性能问题决定整合Redis
开发环境
Spring Boot 2.2 目前最新版,尝个鲜;
整合过程
首先是用Spring Initializr 向导,如果只使用redis那就只选redis的模块,最多再多选一个web模块,不要在向导里选多余的模块,否则会有更多的配置,不配置就有可能给你报错,为了简单起见,我这里只选了redis模块,这是Maven依赖部分
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--
注:因为我这里使用的是spring boot 2.2 所以测试模块会有些不同,这个是
Spring Initializr向导自动生成的,所以不必关关心,默认就好。
-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
然后是application.yml配置文件
spring:
redis:
database: 0
host: 127.0.0.1
password: ''
port: 6379
非常简单的配置,没有什么大问题
Spring Boot 最大的好处就是自动配置功能,需要配置的功能写在配置文件或者配置类里,不需要写的功能就使用默认配置,那么Redis也一定有个自动配置类,我们来看看Redis的自动配置类都为我们配置了些什么
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
@Import({
LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
public class RedisAutoConfiguration {
@Bean
@ConditionalOnMissingBean(name = "redisTemplate")
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
@Bean
@ConditionalOnMissingBean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
加了@Configuration,一个经典的配置类
这个配置类里为容器注入了两个Bean, RedisTemplate 与StringRedisTemplate,查看StringRedisTemplate源码发现StringRedisTemplate只是继承了RedisTemplate<String,String>。
注意!
SpringBoot 自动注入的泛型泛型是RedisTemplate<Object,Object>,所以一会在自动注入的时候千万不要写成RedisTemplate<String,Object>,否则SpringBoot 会报错!!!
接下来写个测试
public class TestObject{
private String name;
private Integer code;
private String phone;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this