Spring Data Redis

1. 概述

Redis是当前最流行的基于内存的 K-V 数据库(通常被用作高性能缓存),本文是对Spring Data Redis的介绍,它向Redis提供Spring Data平台的抽象。

Redis由基于密钥库的数据结构驱动,以持久保存数据,并可用作数据库,缓存,消息代理等。

Spring Data 对其的抽象封装成了我们在 Spring 生态中常见的模板模式,同时还具有所有Spring Data项目的传统简单性。

2. Maven依赖

让我们首先在pom.xml中声明Spring Data Redis依赖项:

1
2
3
4
5
6
7
8
9
10
11
12
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>2.0.3.RELEASE</version>
</dependency>

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

可以从Maven Central下载最新版本的spring-data-redisjedis

3. Redis配置

要定义应用程序客户端和Redis服务器实例之间的连接设置,我们需要使用Redis客户端。

有许多可用于Java的Redis客户端实现。在本教程中,我们将使用Jedis - 一个简单而强大的Redis客户端实现

框架中对XML和Java Config都有很好的支持, 对于本教程,我们将使用Java Config来配置。

3.1 Java配置

让我们从配置bean定义开始:

1
2
3
4
5
6
7
8
9
10
11
@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,然后,我们定义了一个RedisTemplate使用jedisConnectionFactory

3.2 自定义连接属性

您可能已经注意到上述配置中缺少通常的与连接相关的属性。例如,配置中缺少服务器地址和端口。原因很简单:对于我们的示例,我们使用默认值。

但是,如果我们需要配置连接细节,我们总是可以修改jedisConnectionFactory配置,如下所示:

1
2
3
4
5
6
7
@Bean
JedisConnectionFactory jedisConnectionFactory() {
JedisConnectionFactory jedisConFactory = new JedisConnectionFactory();
jedisConFactory.setHostName("localhost");
jedisConFactory.setPort(6379);
return jedisConFactory;
}

4. Redis Repository

让我们使用Student实体作为示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
@RedisHash("Student")
public class Student implements Serializable {

public enum Gender {
MALE, FEMALE
}

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

4.1 Spring Data Repository

现在让我们创建StudentRepository,如下所示:

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

5. 使用StudentRepository进行数据访问

通过在StudentRepository中扩展CrudRepository,我们可以自动获得一组执行CRUD功能的完整持久性方法。

5.1 保存新的学生对象

让我们在数据存储中保存一个新的学生对象:

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

5.2 检索现有学生对象

我们可以通过获取学生数据来验证学生在上一部分中的正确插入:

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

5.3 更新现有学生对象

让我们更改上面检索的学生的姓名并再次保存:

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

最后,我们可以再次检索学生的数据,并验证数据库中的名称是否已更新。

5.4 删除现有学生数据

我们可以删除上面插入的学生数据:

1
studentRepository.deleteById(student.getId());

现在我们可以搜索学生对象并验证结果是否为null

5.5 查找所有学生数据

我们可以插入一些学生对象:

1
2
3
4
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()方法来插入一个集合来实现这,它接受一个包含我们想要持久化的多个学生对象的Iterable对象。

要查找所有插入的学生,我们可以使用findAll()方法:

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

然后我们可以通过检查每个对象的属性来快速检查学生列表的大小或验证更大的粒度。