介绍 Spring Data Redis

概述

本文章主要对 Spring Data Redis 的使用进行一些说明。

主要涉及到如何在 Spring 数据平台上如何使用 Redis。如果你对什么是 Redis 还不太熟悉的话,请参考:Redis 简介 文章中的内容。

简单的来说 Redis 是一个内存使用的 K-V 数据库,我们主要用来进行数据存储。

同时 Redis 还可以对存储的数据进行持久化(把数据存储到硬盘上),通常被作为数据库,缓存或者消息数据来进行使用。

我们将会使用 Spring Data 来对 Redis 存储的数据进行访问,同时接受在 Spring 的项目中是如何进行实现的。

Maven 依赖

首先你需要在你的项目中定义 Spring Data Redis 需要的依赖

这些依赖是定义在 pom.xml 文件中的。

jedis 是我们使用的客户端工具,在 Spring 2.0 版本后,已经默认不使用 jedis 客户端了,而使用的是 lettuce 客户端。

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

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

有关最新的版本,你可以通过访问 Maven 的中央仓库找到,然后更新上面 Pom 文件中的版本。

可选的,如果你不想这么麻烦的话,你可以直接使用 spring-boot-starter-data-redis 在这个包中,对使用的 spring-data-redis 和客户端都全部整合到一起了。

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

Redis 配置

Redis 是通过服务的方式运行的,所以项目中需要对 Redis 连接进行配置。

在这个配置中,我们主要是告诉 Spring 项目如何和 Redis 服务直接进行通信,或者如何让其进行通信。

Redis 的客户端有很多,在这里我们使用的是 Jedis,这个是 Jedis 的客户端实现。

在配置上,我们可以使用 Java 方式进行配置,同时我们也可以使用 XML 的方式进行配置。

Java 方式

让我们通过下面的代码对 Redis 的链接进行配置。

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

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

上面的配置也非常简单:
首先,使用 Jedis 客户端,我们会定义一个 connectionFactory

然后使用 jedisConnectionFactory来定义一个 RedisTemplate

然后我们就可以使用 Spring 的 repository 来通过 RedisTemplate 来访问数据就可以了。

自定义链接属性

需要注意的是,上面的配置中,我们没有定义连接参数。

上面只定义了数据访问需要的工厂类和模板。

例如,我们并没有在我们的项目中定义 Redis 的地址和端口等信息,这是因为我们使用的是默认配置。

如果,你需要使用不同的服务器地址和端口,你可以在 jedisConnectionFactory 中进行配置:

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

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;
    // ...
}

使用 Spring Data Repository

让我们创建一个 StudentRepository,我们会通过这个 Repository 来访问数据。

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

使用 StudentRepository 访问数据

StudentRepository 这个类将会继承 CrudRepository,我们将会自动获得所有 CURD 的持久化方法。

保存一个新的 Student 对象

让我们保存一个新的 student 对象到数据存储中:

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

获得一个已经存在的 Student 对象

我们通过对已经存储中的 Redis 中的数据进行查询来获得我们 Redis 中已经保存的数据对象:

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

更新一个已经存在 Student 的对象

让我们修改 Student 对象的名字后,然后再次进行保存。

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

最后,我们再对保存的数据进行查询,以确保我们对数据的更新完成,并且保存了。

删除已经存在的 Student 对象数据

现在我们可以对保存到 Redis 中的学生对象数据进行删除

studentRepository.deleteById(student.getId());

如果这个时候,你再对数据进行查询的话,返回的接货应该为 null

查询所有的 Student 数据

首先,我们需要把 student 对象插入到 Redis 数据库中:

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() 这个方法。

这个方法可以通过迭代的方式把所有数据插入到数据库中。

如果想从数据库中查询所有的数据的话,我们可以使用 findAll() 这个方法。

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

然后,我们可以检查 students List 的方法来查看 List 的 Size 的大小来判断我们插入和获取数据是否正确。

结论

在本文章中,我们对 Redis 的数据操作进行一些基本的说明和配置。

通过这个配置我们能够使用 Spring Data 的 Repository 来进行操作。