在 Spring Boot 应用中使用 Spring Cache 和 Redis 实现数据查询的缓存功能

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 在 Spring Boot 应用中使用 Spring Cache 和 Redis 实现数据查询的缓存功能

在 Spring Boot 应用中使用 Spring Cache 和 Redis 实现数据查询的缓存功能是一种常见的优化方法,可以显著提高应用程序的性能和响应速度。下面我将详细介绍如何配置和使用这两个技术来实现数据查询的缓存。

 

### 1. 添加依赖

 

首先,确保在 `pom.xml`(如果是 Maven 项目)或 `build.gradle`(如果是 Gradle 项目)中添加必要的依赖:

 

#### Maven 依赖

 

```xml
    org.springframework.boot
    spring-boot-starter-cache
    org.springframework.boot
    spring-boot-starter-data-redis
```

#### Gradle 依赖

 

```gradle
implementation 'org.springframework.boot:spring-boot-starter-cache'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
```

### 2. 配置 Redis

 

在 `application.properties` 或 `application.yml` 中配置 Redis 连接信息:

 

```properties
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=  # 如果有密码,请填写
spring.redis.database=0  # Redis数据库索引,默认为0
```

### 3. 配置 Spring Cache

 

在 Spring Boot 主类(带有 `@SpringBootApplication` 注解的类)或配置类上,使用 `@EnableCaching` 开启缓存功能,并配置一个 `CacheManager` 来管理缓存:

 

```java
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
 
@Configuration
@EnableCaching
public class CacheConfig {
 
    @Bean
    public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
        RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
 
        return RedisCacheManager.builder(redisConnectionFactory)
                .cacheDefaults(cacheConfiguration)
                .build();
    }
}
```

### 4. 使用缓存

 

在 Service 层的方法上使用 `@Cacheable` 注解来实现缓存功能。例如:

 

```java
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
 
@Service
public class MyDataService {
 
    @Cacheable(value = "myDataCache", key = "#id")
    public String getDataById(Long id) {
        // 模拟查询数据库或其他耗时操作
        // 实际项目中,这里应该是从数据库或其他服务获取数据的逻辑
        System.out.println("Fetching data from method for id: " + id);
        return "Data for id " + id;
    }
}
```

在这个例子中,`@Cacheable` 注解的 `value` 属性指定了缓存的名称(例如 `myDataCache`),`key` 属性指定了缓存的键,这里使用方法的参数 `id` 作为缓存的键。

 

### 5. 测试缓存效果

 

编写一个简单的 Controller 来测试缓存效果:

 

```java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
public class MyDataController {
 
    @Autowired
    private MyDataService myDataService;
 
    @GetMapping("/data/{id}")
    public String getDataById(@PathVariable Long id) {
        return myDataService.getDataById(id);
    }
}
```

### 6. 测试缓存

 

启动我们的 Spring Boot 应用程序,并访问 `http://localhost:8080/data/{id}`,多次访问相同的 `id`,可以观察到第一次访问会执行方法体内的逻辑,而后续访问将直接从 Redis 缓存中获取数据,不会再次执行方法体内的逻辑。

 

通过以上步骤,我们就成功地集成了 Spring Cache 和 Redis,实现了数据查询的缓存功能。这种方式非常适合于需要频繁访问和不经常变化的数据,可以有效减少数据库或其他服务的访问压力,提升系统的性能和响应速度。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
12天前
|
Java 关系型数据库 MySQL
创建一个SpringBoot项目,实现简单的CRUD功能和分页查询
【9月更文挑战第6天】该内容介绍如何使用 Spring Boot 实现具备 CRUD 功能及分页查询的项目。首先通过 Spring Initializr 创建项目并选择所需依赖;其次配置数据库连接,并创建实体类与数据访问层;接着构建服务层处理业务逻辑;最后创建控制器处理 HTTP 请求。分页查询可通过添加 URL 参数实现。
|
21天前
|
XML 前端开发 Java
基于SpringBoot 3.3实现任意文件在线预览功能的技术分享
【8月更文挑战第30天】在当今的数字化办公环境中,文件在线预览已成为提升工作效率、优化用户体验的重要功能之一。无论是文档、图片、PDF还是代码文件,用户都期望能够直接在浏览器中快速查看而无需下载。本文将围绕如何在Spring Boot 3.3框架下实现这一功能,分享一系列技术干货,助力开发者高效构建文件预览服务。
103 2
|
6天前
|
缓存 Java 开发工具
Spring是如何解决循环依赖的?从底层源码入手,详细解读Spring框架的三级缓存
三级缓存是Spring框架里,一个经典的技术点,它很好地解决了循环依赖的问题,也是很多面试中会被问到的问题,本文从源码入手,详细剖析Spring三级缓存的来龙去脉。
Spring是如何解决循环依赖的?从底层源码入手,详细解读Spring框架的三级缓存
消息中间件 缓存 监控
28 0
|
16天前
|
NoSQL 前端开发 Java
使用 Spring Boot + Neo4j 实现知识图谱功能开发
在数据驱动的时代,知识图谱作为一种强大的信息组织方式,正逐渐在各个领域展现出其独特的价值。本文将围绕使用Spring Boot结合Neo4j图数据库来实现知识图谱功能开发的技术细节进行分享,帮助读者理解并掌握这一技术栈在实际项目中的应用。
78 4
|
21天前
|
机器学习/深度学习 文字识别 前端开发
基于 Spring Boot 3.3 + OCR 实现图片转文字功能
【8月更文挑战第30天】在当今数字化信息时代,图像中的文字信息越来越重要。无论是文档扫描、名片识别,还是车辆牌照识别,OCR(Optical Character Recognition,光学字符识别)技术都发挥着关键作用。本文将围绕如何使用Spring Boot 3.3结合OCR技术,实现图片转文字的功能,分享工作学习中的技术干货。
58 2
|
21天前
|
安全 Java 应用服务中间件
如何在 Spring Boot 3.3 中实现请求 IP 白名单拦截功能
【8月更文挑战第30天】在构建Web应用时,确保应用的安全性是至关重要的。其中,对访问者的IP地址进行限制是一种常见的安全措施,特别是通过实施IP白名单策略,可以只允许特定的IP地址或IP段访问应用,从而有效防止未授权的访问。在Spring Boot 3.3中,我们可以通过多种方式实现这一功能,下面将详细介绍几种实用的方法。
31 1
|
20天前
|
缓存 Java Spring
Spring缓存实践指南:从入门到精通的全方位攻略!
【8月更文挑战第31天】在现代Web应用开发中,性能优化至关重要。Spring框架提供的缓存机制可以帮助开发者轻松实现数据缓存,提升应用响应速度并减少服务器负载。通过简单的配置和注解,如`@Cacheable`、`@CachePut`和`@CacheEvict`,可以将缓存功能无缝集成到Spring应用中。例如,在配置文件中启用缓存支持并通过`@Cacheable`注解标记方法即可实现缓存。此外,合理设计缓存策略也很重要,需考虑数据变动频率及缓存大小等因素。总之,Spring缓存机制为提升应用性能提供了一种简便快捷的方式。
25 0
|
22天前
|
缓存 NoSQL Java
惊!Spring Boot遇上Redis,竟开启了一场缓存实战的革命!
【8月更文挑战第29天】在互联网时代,数据的高速读写至关重要。Spring Boot凭借简洁高效的特点广受开发者喜爱,而Redis作为高性能内存数据库,在缓存和消息队列领域表现出色。本文通过电商平台商品推荐系统的实战案例,详细介绍如何在Spring Boot项目中整合Redis,提升系统响应速度和用户体验。
44 0
|
XML JSON Java
springboot学习-搭建第一个springboot应用
springboot学习-搭建第一个springboot应用
105 0
springboot学习-搭建第一个springboot应用