1. 概述

本教程是 Spring Data Redis 的入门指南,它为流行的内存数据结构存储 Redis 提供了 Spring Data 平台的抽象能力。

Redis 基于键值存储结构来持久化数据,可以作为数据库、缓存、消息代理等多种用途。

通过 Spring Data Redis,我们可以使用 Spring Data 项目中常见的编程模式(如模板类等),同时保持 Spring 生态一贯的简洁性。

2. Maven 依赖

首先,在 pom.xml 中引入 Spring Data Redis 相关依赖:

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
    <version>3.2.0</version>
</dependency>

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>5.1.2</version>
    <type>jar</type>
</dependency>

最新版本的 spring-data-redisjedis 可在 Maven Central 获取。

✅ 如果你使用的是 Spring Boot,推荐直接使用官方提供的 Starter:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>3.2.0</version>
</dependency>

这样就无需手动引入 spring-data-redisjedis 两个依赖。

最新的版本信息可以从 Maven Central 查看。

3. Redis 配置

为了建立应用程序客户端与 Redis 服务器之间的连接,我们需要使用一个 Redis 客户端。

Java 生态中存在多种 Redis 客户端实现。在本文中,我们选择 Jedis —— 一个简单且功能强大的 Redis 客户端库。

Spring Data Redis 支持 XML 和 Java 两种配置方式。本文将采用 Java 配置 方式进行说明。

3.1. Java 配置

下面是基本的配置 Bean 定义:

@Bean
JedisConnectionFactory jedisConnectionFactory() {
    return new JedisConnectionFactory();
}

@Bean
public RedisTemplate<String, Object> redisTemplate() {
    RedisTemplate<String, Object> template = new RedisTemplate<>();
    template.setConnectionFactory(jedisConnectionFactory());
    return template;
}

配置非常简单:

  • 首先创建一个 JedisConnectionFactory 实例用于连接 Redis。
  • 然后定义一个 RedisTemplate,并绑定上面的连接工厂。这个模板可用于后续的数据操作。

3.2. 自定义连接属性

上面的配置没有显式指定 Redis 服务地址和端口,因为使用了默认值(localhost:6379)。

如果需要自定义这些配置,只需修改 jedisConnectionFactory 的设置即可:

@Bean
JedisConnectionFactory jedisConnectionFactory() {
    JedisConnectionFactory jedisConFactory = new JedisConnectionFactory();
    jedisConFactory.setHostName("localhost");
    jedisConFactory.setPort(6379);
    return jedisConFactory;
}

⚠️ 注意:如果你的 Redis 启用了密码认证或集群模式,还需要额外设置认证信息和节点配置。

4. Redis Repository

我们以一个简单的实体类 Student 为例:

@RedisHash("Student")
public class Student implements Serializable {
  
    public enum Gender { 
        MALE, FEMALE
    }

    private String id;
    private String name;
    private Gender gender;
    private int grade;
    // ...
}

该类使用了 @RedisHash 注解,表示它会被映射到 Redis 中的一个哈希结构中。

4.1. Spring Data Repository

接下来创建一个 Repository 接口:

@Repository
public interface StudentRepository extends CrudRepository<Student, String> {}

通过继承 CrudRepository,我们就自动拥有了完整的 CRUD 操作方法。

5. 使用 StudentRepository 进行数据访问

5.1. 新增学生对象

保存一个新的学生对象:

Student student = new Student(
  "Eng2015001", "John Doe", Student.Gender.MALE, 1);
studentRepository.save(student);

5.2. 查询已存在的学生对象

验证是否成功插入:

Student retrievedStudent = 
  studentRepository.findById("Eng2015001").get();

5.3. 更新学生对象

更新学生的姓名并重新保存:

retrievedStudent.setName("Richard Watson");
studentRepository.save(student);

再次查询可确认数据已被更新。

5.4. 删除学生对象

删除某个学生记录:

studentRepository.deleteById(student.getId());

此时再尝试查找该 ID 对应的学生对象,结果应为 null

5.5. 批量查询所有学生

插入多个学生对象:

Student engStudent = new Student(
  "Eng2015001", "John Doe", Student.Gender.MALE, 1);
Student medStudent = new Student(
  "Med2015001", "Gareth Houston", Student.Gender.MALE, 2);
studentRepository.save(engStudent);
studentRepository.save(medStudent);

也可以使用 saveAll() 方法批量插入集合:

List<Student> studentsToSave = Arrays.asList(engStudent, medStudent);
studentRepository.saveAll(studentsToSave);

获取所有学生对象的方法也很直观:

List<Student> students = new ArrayList<>();
studentRepository.findAll().forEach(students::add);

你可以检查列表大小或者逐个验证每个对象的属性。

6. 总结

这篇文章带你初步了解了如何在 Spring 项目中集成和使用 Redis。借助 Spring Data Redis,我们可以轻松实现对 Redis 数据的访问和管理,而无需过多关注底层细节。

文中示例代码可在 GitHub 项目 中找到。


原始标题:Introduction to Spring Data Redis