点评--day01--Spring Data Redis

2 阅读3分钟

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);
    }
}