SpringBoot : ch09 整合Redis
前言
当你的应用程序需要一个快速、可扩展的内存数据库时,Redis是一个非常流行的选择。通过将Redis与Spring Boot集成,你可以轻松地利用Redis的功能,例如缓存、会话存储和消息队列等,从而提升应用程序的性能和可伸缩性。
在本教程中,我们将深入探讨如何在Spring Boot项目中整合Redis。我们将学习如何配置Redis连接、使用Spring Data Redis来进行数据访问操作,以及如何利用Redis作为缓存来提高应用程序的效率。无论你是刚刚接触Spring Boot还是已经有一定经验,这篇教程都将为你展示如何利用Redis为你的应用程序增添强大的功能。
通过本教程的学习,你将对Spring Boot与Redis的整合有一个清晰的理解,并能够在实际项目中应用这些知识。让我们一起开始,探索Spring Boot与Redis这个强大组合带来的无限可能吧!
一、前期准备
1、新建项目,结构如下
2、导入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 使用 jackson 序列化器,需要依赖JACKSON包 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>11</source>
<target>11</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<mainClass>edu.nf.ch09.Ch09Application</mainClass>
<skip>true</skip>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
这段代码是一个基于Spring Boot的项目的
pom.xml
文件,其中包含了该项目的依赖管理和构建配置。
依赖:
spring-boot-starter-data-redis
:这是Spring Boot提供的用于集成Redis的starter,可以方便地进行Redis数据库访问。jackson-databind
:这是Jackson库的核心依赖,用于实现Java对象与JSON之间的序列化和反序列化操作。spring-boot-starter-test
:这是Spring Boot提供的用于单元测试的starter,包含了常用的测试框架和工具。lombok
:这是一个Java库,用于简化Java代码的编写。它提供了一些注解(如@Data
、@Getter
、@Setter
等),可以自动生成getter、setter方法等。依赖管理:
spring-boot-dependencies
:这是Spring Boot提供的依赖管理BOM(Bill of Materials)文件,用于管理项目中使用的Spring Boot相关依赖的版本。构建配置:
maven-compiler-plugin
:这是Maven的编译插件,用于配置项目的编译选项。在这里,设置了Java的源码版本和目标版本为11,并指定了编码格式为UTF-8。spring-boot-maven-plugin
:这是Spring Boot的Maven插件,用于支持将Spring Boot应用程序打包成可执行的JAR文件。在这里,配置了主类的名称和打包方式为repackage
。通过以上的配置,可以管理项目的依赖关系,并使用Maven进行项目的构建和打包操作。同时,该项目还集成了Spring Boot、Redis和Lombok等技术,以便开发和测试Spring Boot应用程序。
二、配置 RedisConfig 配置类
@Configuration
public class RedisConfig {
/**
* 自定义 RedisTemplate
* @param connectionFactory
* @return
*/
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory connectionFactory){
RedisTemplate<String,Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
// 设置 key 的序列化器
template.setKeySerializer(RedisSerializer.string());
template.setHashKeySerializer(RedisSerializer.string());
// 设置 value 的序列化器
template.setValueSerializer(RedisSerializer.json());
template.setHashValueSerializer(RedisSerializer.json());
return template;
}
}
这段代码是一个自定义RedisTemplate的配置类。在Spring Boot中,可以通过自定义配置类来创建和配置自定义的Bean。
首先,使用
@Configuration
注解标识该类是一个配置类,Spring Boot会在启动时加载并应用该配置。然后,在
redisTemplate()
方法上使用@Bean
注解,表示将该方法返回的对象注册为一个Bean,并由Spring容器进行管理。在
redisTemplate()
方法中,通过参数RedisConnectionFactory
获取到Redis连接工厂,作为创建RedisTemplate的参数。接着,创建一个RedisTemplate对象,并将连接工厂设置为其连接工厂。
然后,通过调用
setKeySerializer()
和setValueSerializer()
方法,分别设置key和value的序列化器。在这里,使用了RedisSerializer的静态方法string()
和json()
来获取String和JSON的序列化器。最后,返回创建的RedisTemplate对象。
通过自定义RedisConfig类,可以创建一个自定义的RedisTemplate,并对其进行相关配置,例如设置序列化器等。在其他需要使用RedisTemplate的地方,可以直接注入该Bean来进行操作。
需要注意的是,为了让Spring Boot能够正确识别和加载自定义RedisTemplate,需要将RedisConfig类所在的包路径包含在@ComponentScan或@SpringBootApplication注解中。或者将RedisConfig类放在主配置类(如Application类)所在的子包下,这样可以自动扫描到该配置类。
三、配置 yml
spring:
# 配置 redis 配置
redis:
# 指定使用第几个数据库
database: 0
# 主机地址
host: 127.0.0.1
# 端口号
port: 6379
# 指定超时时间
timeout: 2000
这段配置是用来配置Spring Boot应用程序连接Redis的相关参数。
在配置文件中,以
spring.redis
为前缀,可以设置以下参数:
database
:指定要使用的Redis数据库,默认为0。如果应用程序需要访问多个数据库,可以通过修改此值来切换数据库。
host
:指定Redis服务器的主机地址。在这里,设置为127.0.0.1表示本地主机。
port
:指定Redis服务器的端口号。默认情况下,Redis服务器使用6379作为默认端口。
timeout
:指定连接到Redis服务器的超时时间,单位为毫秒。如果连接在指定的时间内没有响应,将会抛出连接超时异常。通过在配置文件中设置这些参数,应用程序将会使用指定的主机地址、端口号和超时时间来连接到Redis服务器。这样,在应用程序中就可以直接使用自动装配的RedisTemplate进行操作。
需要注意的是,配置文件的格式可能会根据不同的配置方式而有所差异。上述示例是使用YAML格式的配置文件,如果你使用的是其他格式的配置文件,可能需要做相应的调整。
四、新建一个 User 实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
private Integer id;
private String userName;
}
这段代码定义了一个User类,该类具有以下特点:
使用了
@Data
注解,它是Lombok库提供的一个注解,用于自动生成getter、setter、toString、equals、hashCode等常用方法。使用了
@AllArgsConstructor
注解,它是Lombok库提供的一个注解,用于生成一个包含所有参数的构造函数。使用了
@NoArgsConstructor
注解,它是Lombok库提供的一个注解,用于生成一个无参构造函数。实现了
Serializable
接口,表示该类可以在网络中进行传输或在磁盘上进行存储,这通常用于对象的序列化和反序列化操作。该User类有两个属性:
id
:表示用户的ID,类型为Integer。
userName
:表示用户名,类型为String。通过使用Lombok库提供的注解,可以简化Java类的编写,自动生成常用的方法和构造函数,减少了冗余的代码。同时,实现Serializable接口可以让User类的对象在不同的环境中进行传输和持久化存储。
五、操作 redis
1、返回 String
@Service
@RequiredArgsConstructor
public class UserService {
/**
* 默认装配的是 StringRedisTemplate ,用于操作字符串
*/
private final StringRedisTemplate template;
/**
* key 的前缀
*/
private final static String PREFIX = "user:";
/**
* 返回 String
* @param id
* @return
*/
public String getUser(Integer id){
if (!template.hasKey(PREFIX + id)){
// 保存到 Redis
template.opsForValue().set(PREFIX + id,"user1");
// 设置过期时间
template.expire(PREFIX + id,1800, TimeUnit.MINUTES);
}
return template.opsForValue().get(PREFIX + id);
}
}
这段代码定义了一个名为UserService的服务类,其中包含以下方法:
getUser(Integer id)
:该方法接受一个参数id,表示要获取用户信息的ID。如果Redis中存在该用户的信息,则直接从Redis中获取并返回;否则,将用户信息保存到Redis中,并设置过期时间为30分钟,最后再返回用户信息。在该服务类中使用了
@Service
注解,表示将该类标记为一个服务类,并由Spring容器进行管理。在构造函数上使用了
@RequiredArgsConstructor
注解,它是Lombok库提供的一个注解,用于生成一个包含所有final成员变量的构造函数,并自动进行依赖注入。在这里,使用了StringRedisTemplate类的实例作为依赖注入的参数,表示将其注入到UserService类中。在getUser()方法中,首先判断Redis中是否存在指定的key,如果不存在则将用户信息保存到Redis中,并设置过期时间为30分钟。最后,从Redis中获取用户信息并返回。
通过将业务逻辑封装在服务类中,可以使得业务逻辑与具体的实现细节解耦,方便进行单元测试和维护。同时,使用StringRedisTemplate类来操作Redis,可以简化对Redis的操作,提高开发效率。
2、返回一个对象
@Service
@RequiredArgsConstructor
public class UserService {
private final RedisTemplate<String, Object> template;
/**
* key 的前缀
*/
private final static String PREFIX = "user:";
/**
* 返回 对象
* @param id
* @return
*/
public User getUser(Integer id){
if (!template.hasKey(PREFIX + id)){
User user = new User(id,"qiu");
// 保存到 Redis
template.opsForValue().set(PREFIX + id,user);
// 设置过期时间
template.expire(PREFIX + id,1800, TimeUnit.SECONDS);
}
return (User) template.opsForValue().get(PREFIX + id);
}
}
解释如下:
@Service
注解表示这是一个Spring的服务组件,用于处理业务逻辑。@RequiredArgsConstructor
注解是Lombok库提供的注解,用于生成带有必需参数的构造函数。RedisTemplate<String, Object>
是一个用于操作Redis的模板类,其中String
表示Redis的key的类型,Object
表示Redis的value的类型。PREFIX
是一个常量,用于设置Redis中存储用户对象的key的前缀。getUser()
方法用于获取用户对象。首先,它会检查Redis中是否存在指定key,如果不存在,则创建一个新的User
对象,并将其保存到Redis中。同时,还设置了该key的过期时间为1800秒。最后,通过模板类的opsForValue().get()
方法从Redis中获取用户对象并返回。通过使用这个
UserService
类,你可以在获取用户对象时先尝试从Redis缓存中获取,如果缓存中不存在,则去数据库中查询,并将结果存入Redis缓存,以提高查询性能和减轻数据库负载。
3、测试
1)返回字符串
@Test
void contextLoads() {
String user = service.getUser(1000);
log.info(user);
}
运行结果:
2)返回对象
@Test
void contextLoads() {
User user = service.getUser(2);
log.info(user.getUserName());
}
运行结果:
六、SpringBoot 整合 Redis 的好处?
Spring Boot 整合 Redis 有以下几个好处:
-
缓存支持:Redis 是一种高性能的缓存数据库,通过将数据存储在 Redis 中,可以大大提高系统的读取性能。Spring Boot 提供了对 Redis 的无缝集成,可以方便地使用 Redis 作为缓存存储。
-
分布式锁支持:在分布式系统中,为了保证数据的一致性和避免并发冲突,常常需要使用分布式锁。Redis 提供了原子操作和特定数据结构(如 Redisson)来实现分布式锁。通过 Spring Boot 整合 Redis,可以方便地使用 Redis 实现分布式锁,确保多个节点之间的数据访问的互斥性。
-
会话管理支持:在 Web 应用程序中,会话管理是非常重要的功能。通过 Spring Session 和 Redis 结合使用,可以将会话数据存储在 Redis 中,实现分布式环境下的会话共享,提高系统的可伸缩性和稳定性。
-
发布/订阅支持:Redis 提供了发布/订阅模式,可以实现消息的广播和订阅。通过 Spring Boot 整合 Redis,可以方便地使用 Redis 的发布/订阅功能,实现消息的异步通信和事件驱动。
-
数据持久化支持:除了作为缓存数据库,Redis 还可以作为持久化存储数据库使用。通过 Spring Boot 整合 Redis,可以方便地将数据持久化到 Redis 中,并进行读取和查询。
综上所述,Spring Boot 整合 Redis 可以提供缓存支持、分布式锁支持、会话管理支持、发布/订阅支持和数据持久化支持,增强了系统的性能、可伸缩性和稳定性,使开发人员可以更方便地利用 Redis 提供的功能和特性。