1. 认识 Spring Data Redis
Spring Data 是 Spring 中用于数据操作的模块,其中对 Redis 的集成模块叫做 Spring Data Redis。它是企业开发中最常用的 Redis 客户端工具。 它的核心特性包括:
- 底层整合:提供了对不同底层 Redis 客户端(如 Lettuce 和 Jedis)的整合。SpringBoot 默认使用的是 Lettuce。
- 统一的 API:提供了
RedisTemplate统一 API 来操作 Redis。 - 功能丰富:支持 Redis 的发布订阅模型、哨兵和集群架构、响应式编程,以及基于 JDK、JSON、字符串等多种方式的数据序列化及反序列化。
2. RedisTemplate 的核心 API
RedisTemplate 将 Redis 的各种操作根据不同的数据结构封装到了不同的类型中:
redisTemplate.opsForValue():操作 String 类型数据。redisTemplate.opsForHash():操作 Hash 类型数据。redisTemplate.opsForList():操作 List 类型数据。redisTemplate.opsForSet():操作 Set 类型数据。redisTemplate.opsForZSet():操作 SortedSet 类型数据。redisTemplate:用于执行通用的命令(如删除 key、设置有效期等)。
3. Spring Data Redis 快速入门步骤
SpringBoot 已经提供了极其简便的支持,标准使用步骤如下:
第一步:引入依赖 在 pom.xml 中引入 Redis 启动器依赖以及连接池依赖:
<!--redis依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--连接池依赖-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
第二步:在 application.yml 中配置 Redis 信息
spring:
redis:
host: 192.168.150.101
port: 6379
password: 123321
lettuce:
pool:
max-active: 8 # 最大连接数
max-idle: 8 # 最大空闲连接数
min-idle: 0 # 最小空闲连接数
max-wait: 100ms # 连接等待时间
第三步:注入并使用 RedisTemplate 得益于 SpringBoot 的自动装配,我们可以直接在代码中注入并使用:
@SpringBootTest
class RedisDemoApplicationTests {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Test
void testString() {
// 存入和读取数据
redisTemplate.opsForValue().set("name", "虎哥");
Object name = redisTemplate.opsForValue().get("name");
System.out.println("name = " + name);
}
}
4. 核心进阶:数据序列化策略演进(非常重要)
在使用 Spring Data Redis 存储对象时,会经历一个序列化策略的演进过程。
4.1 默认的 JDK 序列化(不推荐)
RedisTemplate 可以接收任意 Object 作为值写入 Redis。但默认采用的是 JDK 序列化。 缺点:序列化后的数据在 Redis 可视化工具中是一堆乱码(可读性差),并且会占用非常大的内存空间。
4.2 自定义 JSON 序列化器
为了提高可读性,我们可以自定义 RedisTemplate,将其默认的序列化器修改为 GenericJackson2JsonRedisSerializer。 带来的新问题:整体可读性提升了,但为了能够在查询时自动反序列化为对应的 Java 对象,JSON 结果中会记录对象的 @class 名称(例如 {"@class": "com.heima.redis.pojo.User", "name": "虎哥"})。这会带来额外的内存开销。
4.3 终极方案:StringRedisTemplate(强烈推荐)
为了最大程度节省内存空间,企业开发中最普遍的做法是:统一使用 String 序列化器,也就是直接使用 Spring 提供的 StringRedisTemplate 子类。 在这种方案下,存入和读取时的序列化及反序列化都由开发者手动完成(如利用 Jackson 的 ObjectMapper 或者 FastJSON、Gson等),Redis 中不再存储额外的 @class 结构。
代码示例(方案二最佳实践) :
@SpringBootTest
class RedisStringTests {
@Autowired
private StringRedisTemplate stringRedisTemplate;
// 使用Jackson工具类
private static final ObjectMapper mapper = new ObjectMapper();
@Test
void testSaveUser() throws Exception {
// 1. 创建 Java 对象
User user = new User("虎哥", 21);
// 2. 手动序列化为 JSON 字符串
String json = mapper.writeValueAsString(user);
// 3. 写入 Redis
stringRedisTemplate.opsForValue().set("user:200", json);
// 4. 从 Redis 获取 JSON 字符串数据
String jsonUser = stringRedisTemplate.opsForValue().get("user:200");
// 5. 手动反序列化为 Java 对象
User user1 = mapper.readValue(jsonUser, User.class);
System.out.println("user1 = " + user1);
}
}