Spring Data Redis-重点
2025年11月26日大约 4 分钟
Spring Data Redis-重点
Spring Data是Spring中操作数据的模块,包括对各种数据库的集成,而Spring Data Redis就是专门针对Redis的集成模块。
- Spring Data Redis特点:
- 提供对不同Redis客户端的整合,包括Jedis和Lettuce。
- 提供了一个统一的
RedisTemplate接口,简化了对Redis的操作。 - 支持Redis的发布/订阅功能。
- 支持Redis的哨兵和Redis集群。
- 支持基于Lettuce的响应式编程模型。
- 支持基于JDK、JSON、字符串和Spring对象的数据序列化和反序列化。
- 支持基于Redis的JDKCollection实现。
RedisTemplate提供的常用方法
| 方法 | 返回值类型 | 说明 |
|---|---|---|
opsForValue() | ValueOperations | 操作String类型数据 |
opsForHash() | HashOperations | 操作Hash类型数据 |
opsForList() | ListOperations | 操作List类型数据 |
opsForSet() | SetOperations | 操作Set类型数据 |
opsForZSet() | ZSetOperations | 操作SortedSet类型数据 |
RedisTemplate使用步骤
- 添加Maven依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> - 配置Redis连接信息(通过
application.yml文件配置)spring: data: redis: host: localhost port: 6379 password: your_password # 如果有密码 lettuce: pool: max-active: 8 # 最大连接数 max-idle: 8 # 最大空闲连接数 min-idle: 2 # 最小空闲连接数 max-wait: 1000ms # 获取连接的最大等待时间,单位ms提示
spring-data-redis默认使用Lettuce作为Redis客户端,如果需要使用Jedis,需要添加Jedis的依赖,并且在配置文件中指定使用Jedis。
注意
连接池需像上面一样手动配置,否则不会启用连接池。
- 注入
RedisTemplate对象,执行Redis命令@Autowired private RedisTemplate redisTemplate; @Test public void testRedisTemplate() { redisTemplate.opsForValue().set("name", "akira"); // 插入数据 // 获取字符串类型数据 String value = (String) redisTemplate.opsForValue().get("name"); // 获取数据 System.out.println("Value: " + value); }
序列化和反序列化
前情提要
在尝试了RedisTemplate使用后,你查看Redis数据库会发现一个问题,
当使用RedisTemplate操作Redis时,存储在Redis中的数据是经过序列化处理的二进制数据,
而不是我们直接输入的字符串或者Java对象,为什么呢?
方式1- 自定义RedisSerializer
Spring Data Redis默认使用JDK序列化方式,这种方式会将Java对象序列化成二进制数据存储在Redis中,这样虽然可以存储复杂的Java对象,但不方便查看和调试。
我们可以通过自定义RedisSerializer来改变默认的序列化方式,例如使用JSON序列化,这样存储在Redis中的数据就会以JSON格式显示,更加直观。
- 首先创建Redis的配置类,注入自定义的
RedisTemplate对象,并设置自定义的RedisSerializer。
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); // 创建RedisTemplate对象
redisTemplate.setConnectionFactory(redisConnectionFactory); // 设置Redis连接工厂
// 设置自定义的RedisSerializer
redisTemplate.setKeySerializer(new StringRedisSerializer()); // key使用String序列化
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); // value使用JSON序列化
return redisTemplate;
}
}此时,使用RedisTemplate操作Redis时,方便查看和调试存储在Redis中的数据了。
注意
可能需要导入Jackson的依赖才能使用GenericJackson2JsonRedisSerializer,如果没有导入会报错。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>方式2- 使用StringRedisTemplate
前情提要
在上面我们自定义的RedisSerializer存储Object类型的数据时,会发现它会存储对象的class信息,如
{"@class":"com.mirco.domemybatis.entity.TestMy","id":1,"name":"测试","age":19}这样会带来额外的内存开销。
如果我们想要减少存储在Redis中的数据的内存开销,可以使用StringRedisTemplate。
- 它是
RedisTemplate的一个子类,专门用于操作String类型的数据,默认使用字符串序列化方式。 - 使用时直接注入
StringRedisTemplate对象,操作String类型的数据即可。@Autowired private StringRedisTemplate stringRedisTemplate; - 但是对于
Object类型,存储和取出时,需要手动进行序列化和反序列化处理。- 序列化和反序列化可以使用第三方库,如FastJson,来将Java对象转换成JSON字符串进行存储,取出时再将JSON字符串转换回Java对象。
- 下面以FastJson为例,演示如何使用
StringRedisTemplate存储和取出Object类型的数据。
// 存储Object类型数据
TestMy testMy = new TestMy(1, "测试", 19);
String json = JSON.toJSONString(testMy); // 序列化为JSON字符串
stringRedisTemplate.opsForValue().set("testMy", json); // 存储JSON字符串
// 取出Object类型数据
String jsonValue = stringRedisTemplate.opsForValue().get("testMy"); // 获取JSON字符串
TestMy testMyValue = JSON.parseObject(jsonValue, TestMy.class); // 反序列化为Java对象
System.out.println("TestMy Value: " + testMyValue);