整合Redis
Redis是一款高性能的非关系性数据库,他基于内存存储数据,并且在底层做了数据结构优化,读写的效率都非常高,在开发中往往作为数据缓存的首选。在使用Spring Boot开发web应用时,可以使用Spring Boot官方提供的starter轻松整合Redis到项目中
导入依赖
使用Redis,首先需要导入对应的starter
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
官方的starter默认使用Lettuce作为客户端,如果需要使用Jedis作为客户端,需要排除Lettuce的依赖,再导入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>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
设置配置
导入依赖之后,需要在Spring Boot的核心配置文件中添加Redis相关配置,主要有Redis的主机号和端口号,还可以指定在Redis中存放的数据库号,如果有配置Redis的访问密码,也需要配置
spring:
redis:
host: 127.0.0.1
port: 6379
database: 1
password: 12345
存储和获取数据
Spring Boot的starter为我们提供了两个操作Redis的组件,分别是RedisTemplate
和StringRedisTemplate
,StringRedisTemplate
其实就是泛型为<String , String>类型的RedisTemplate
,Redis储存字符串类型的场景较多,如果储存字符串类型的数据,就可以直接使用StringRedisTemplate
使用这两个组件时,只需要将Template自动注入,然后调用Template的方法既可操作Redis,Template中的方法与Redis客户端命令是一一对应的
@SpringBootTest
class MyTest {
@Autowired
StringRedisTemplate redisTemplate;
@Test
void test() {
redisTemplate.opsForValue().set("hello", "world");
}
}
以上示例向Redis中存放了一条字符串数据,使用RDM可视化工具查看存放的数据
对应的也有获取Redis数据的方法
@SpringBootTest
class MyTest {
@Autowired
StringRedisTemplate redisTemplate;
@Test
void test() {
String res = redisTemplate.opsForValue().get("hello");
System.out.println(res);
}
}
从Redis中获取到了数据
序列化
在开发中,我们往往将一个对象直接作为键值对中的值存储在Redis中,由于Redis默认使用JDK序列化,所以存储的对象的类需要实现Serializable
接口
@Data
@AllArgsConstructor
public class User implements Serializable {
private Integer id;
private Integer age;
private String name;
private String address;
}
然后自定义一个泛型为<String , Object>的Template
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
存储对象数据
@SpringBootTest
class MyTest {
@Autowired
RedisTemplate<String, Object> redisTemplate;
@Test
void test() {
User user = new User(1, 18, "cong", "HZ");
redisTemplate.opsForValue().set("user", user);
}
}
对象成功存到了Redis中,但是发现通过默认的JDK序列化后,存放的数据是不可读的
这时候就需要对template的键和值分别进行序列化设置,这里使用Jackson作为Object对象的序列化器
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
template.setKeySerializer(stringRedisSerializer);
template.setHashKeySerializer(stringRedisSerializer);
GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
template.setValueSerializer(jackson2JsonRedisSerializer);
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
再次测试,发现Object对象序列化为JSON